java day7
Object 클래스 | 상속 | 접근 제어자 | 패키지 | static
Object 클래스
- java.lang.Object, 모든 클래스의 최상위 클래스
- 모든 클래스는 Object 클래스의 메소드를 사용할 수 있고, 일부 메소드를 override 해서 사용할 수도 있음.
- Object 클래스가 들어있는 java.lang 패키지는 컴파일러에 의해 자동으로 import 됨.
toString()
- 객체의 해시코드 출력
- 클래스@해시코드, getClass().getName() + “@” + Integer.toHexString(hashCode())
- 객체의 정보를 문자열 형태로 표현하고자 할 때 override 를 자주 하는 편
equals()
- 객체의 값(==) 연산
hashcode()
- JVM 이 부여한 코드값
- 객체가 저장된 가상머신의 주소를 10진수로 반환
clone()
- 객체의 복사본을 만듬
- clone() 은 객체를 복제할 때 private 필드도 복제할 수 있기 때문에 은닉화에 위배
상속
- 특정 클래스를 구성할 때 기존 클래스의 데이터와 메소드를 부모 클래스에서 그대로 물려받아 중복적인 코드를 줄이는 것
- 하나의 변수 타입으로 여러 종류의 객체를 의미하는 추상화된 방식의 프로그램을 가능하게 해줌
상속성
- 상위 개념의 특징을 하위 개념이 물려받는 것.
- 재사용으로 인해 코드를 줄임
- 객체지향 프로그래밍의 하이라이트
다형성
- 부모클래스에서 물려받은 가상함수를 자식 클래스에서 오버라이딩되어 사용하는 것
- 클래스 내부에 동일한 이름의 오퍼레이션을 여러개 정의하는 것
- 자바에서 상속을 하는 방법
접근제어자 class 클래스명 extends 부모클래스명{
클래스 설계;
...
}
오버라이딩
- 부모클래스에 있는 필드 또는 메소드를 자식 클래스가 재정의 하는 것
오버로딩
- 동일한 이름의 메소드들을 매개변수의 타입과 개수를 다르게 하여 여러 메소드를 사용할 수 있는 기능.
instanceof 연산자
- 참조변수가 참조하고 있는 인스턴스(객체)의 실제 타입을 알아보기 위해 사용하는 연산자
- instanceof 왼쪽에는 참조변수를, 오른쪽에는 타입(클래스 명)이 피연산자로 위치
- 연산의 결과는 boolean값으로 반환(true : 형변환이 가능)
접근 제어자
- 외부에 공개되는 수준을 의미
- public, protected, default, private
public : 모든 외부에서 직접 접근하거나 호출 protected : 현재 클래스와 동일한 패키지거나 다른 패키지더라도 상속시 접근하거나 호출 default : 현재 클래스와 동일한 패키지 내에서만 호출(접근제어자를 표기하지않으면 default) private : 현재 클래스의 {}바깥쪽에서는 절대 접근하거나 호출할 수 없음
클래스 접근 제한
- public, default 만 사용 가능
- public인 경우 외부에 클래스를 노출, default는 현재 패키지에서만 접근할 수 있게 함
필드의 접근 제한
- public, protected, default, private 모두 사용가능
- 일반적으로 private, public static으로 선언하는 것이 일반적
메소드의 접근 제한
- public, protected, default, private 모두 사용가능
- 추상메소드의 형태로 메소드를 만들 때 private으로 선언할 수 없음
패키지
- 클래스의 파일들을 체계적으로 관리하도록 사용하는 디렉토리 개념
사용자가 패키지를 만드는 형태
com.회사명.프로젝트명
예) com.koreait.kakaotalk.db
🎁 패키지의 맨 뒤는 주로 패키지 안에 있는 클래스들의 역할로 작성되는 경우가 많음
static
- 모든 객체가 공유한다는 의미
- static이 붙은 변수는 클래스 변수 (static이 붙지 않은 변수는 인스턴스 변수)
- 메모리에 우선 로드되므로 속도가 빠름
- 메모리가 회수되지않기 때문에 주의
변수에 적용 - 모든 객체가 변수를 공용으로 사용
public class Static1 {
public static void main(String[] args) {
Button customer1 = new Button();
customer1.click();
customer1.click();
customer1.click();
customer1.click();
Button customer2 = new Button();
customer2.click();
}
}
----------------------------------------------------
public class Button {
private static int count = 0; // 모든 객체가 공유하게 됨(공용변수)
public void click(){
count++;
System.out.println("고객님의 대기번호는 " + count + "입니다.");
}
}
블록에 적용 - 같은 객체가어려개 만들어지더라도 단 한번만 실행되는 코드블록을 만듬
public class Static2 {
public static void main(String[] args) {
Block block1 = new Block();
Block block2 = new Block();
block1.print();
block2.print();
}
}
----------------------------------------------------
public class Block {
static {
System.out.println("static 블록을 테스트합니다.");
System.out.println("이 블록은 객체를 생성할 때 단 한번만 실행됩니다.");
}
public void print(){
System.out.println("😃😃😃😃😃😃😃😃😃");
}
}
메소드에 적용 - 객체를 사용하지 않고 클래스, 메소드 이름으로 접근하여 사용
import java.util.Scanner;
public class Static3 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("반지름을 입력하세요.");
double r = sc.nextDouble();
double area = AreaUI.calcCircle(r);
System.out.println("원의 넓이는 : " + area);
}
}
-----------------------------------------------------
public class AreaUI {
public static double calcCircle(double radius){
return (radius * radius) * Math.PI;
}
}