클래스 - 설계도
클래스 종류
- 라이브러리 클래스(객체를 만들기 위한 클래스)
- 실행 클래스(main메소드, 객체를 생성)
구성멤버 - 필드, 생성자, 메소드(기능)
인스턴스 멤버 - 인스턴스 필드, 인스턴스 메소드 --> 객체를 생성해야만 접근 가능
정적멤버 static 키워드
객체 - 인스턴스
접근제한자
public - 모든 클래스 접근 가능
protected - 같은 패키지, 자식클래스(상속받은 하위클래스)
(default) - 같은 패키지
private - 내부 클래스 내에서만 가능
클래스 접근 지정자 --> public, default
멤버 접근 지정자
필드
Getter, Setter 메소드
상속 : 부모클래스의 멤버를 자식클래스에게 물려줄 수 있다
class Child extends Parent { }
주의할 점
- 하나의 부모만 상속받을 수 있다
- 부모클래스에서 private필드와 메소드는 상속 대상에서 제외
- 부모와 자식클래스가 다른 패키지일 경우 default 접근 제한된 필드와
메소드는 상속 대상에서 제외
상위 클래스 -> 슈퍼클래스
하위 클래스 -> 서브클래스
오버라이딩 : 상위클래스의 메소드를 서브클래스에서 재정의
super.method();
public Child(String name) {
super() // 생략 가능
super(name); // 상위클래스의 생성자 호출
}
다형성
타입변환 + 오버라이딩
클래스 자동타입변환
Animal animal1 = new Cat();
Animal animal2 = new Dog();
Animal animal3 = new Animal();
animal1.sound();
animal2.sound();
class Animal {
public sound() {
System.out.println("소리를 냅니다")
}
}
class Cat extends Animal {
public sound() {
System.out.println("냐옹냐옹")
}
}
강제타입변환 : 캐스팅
Cat cat1 = (Cat) animal1;
Dog dog1 = (Dog) animal2;
instanceof 연산자
객체 instanceof 타입
객체가 타입의 인스턴스냐? 맞으면 true 아니면 false
추상 클래스 : 실체가 없는 클래스 ---> 객체를 생성할 수 없다
부모 역할만 하는 클래스
직접 객체 생성할 수 없지만, 자식 객체 생성할 때 객체화는 가능
추상 메소드 : 메소드 선언만 하고 실행 블럭은 없음 ---> 실행 내용은 실체클래스마다 달라야하는 경우
- abstract키워드로 선언하고 중괄호가 없는 메소드
- 하위 클래스는 반드시 재정의해서 실행 내용을 작성해야함
class abstract Animal {
public abstract sound() // 추상 메소드
}
public abstract Anamal { }
오버로딩
생성자 오버로딩
public Cat() {
new Cat();
}
public Cat(String name, int age) {
new Cat("크림", 2)
this.name = name;
this.age = age;
}
메소드 오버로딩
인터페이스 : 객체의 사용 방법을 정의한 타입
인터페이스를 통해
다양한 객체를 동일한 사용 방법으로 이용 가능, 다형성 구현 가능
개발 코드는 인터페이스를 통해서 객체와 서로 통신
인터페이스의 메소드 호출하면 객체의 메소드가 호출
개발 코드를 수정하지 않으면서 객체 교환이 가능함
클래스와 물리적 파일 형태는 같으나 소스 작성 내용이 다름
인터페이스는 객체로 생성할 수 없어 생성자를 가질 수 없음
인터페이스 내의 필드는 상수만 가능하므로
public static final(상수필드선언) 생략 가능
- 상수 이름은 항상 대문자로 작성, 여러 단어일 경우 언더바_로 연결
인터페이스 내의 메소드는 추상클래스이므로 public abstract 생략 가능
구현 클래스 : 인터페이스에서 정의된 추상메소드를 재정의해서 실행내용을 가지고 있는 클래스
- 클래스 선언부에 implements 키워드를 추가하고 인터페이스 이름 명시
다중 인터페이스 구현 클래스
다중인터페이스 사용 시 해당 인터페이스 타입으로 지정하면
해당 인터페이스의 구현 메소드만 사용 가능
객체는 다수의 인터페이스타입으로 사용 가능
인터페이스가 가지는 멤버
public 상수필드
public 추상메소드
public 디폴트메소드
public 정적메소드
private 메소드 ---> default메소드 안에서만 호출 가능
- private 메소드 용도 : 디폴트와 정적 메소드 소스들의 중복 코드를 줄이기 위해서 사용
private 정적메소드 ---> default메소드, 정적 메소드 안에서만 호출 가능
타입변환
인터페이스와 구현 클래수 간에 발생
인터페이스 변수에 구현 객체 대입 - 자동타입변환
인터페이스 타입은 구현 클래스 타입으로 변환 - 강제타입변환