반응형
해당 강의를 보고 정리한 것입니다.
https://programmers.co.kr/learn/courses/5
상속
: 부모가 가진 것을 자식에게 몰려주는 것을 의미
- 노트북은 컴퓨터의 한 종류
- 침대는 가구의 한 종류, 혹은 침대는 가구
- 소방차는 자동차
해당 관계들을 "is a" 관계 혹은 "kind of" 관계라고 함.
Car를 상속받은 Bus를 class로 표현하는 방법
- 부모 클래스 Car
public class Car { String name; int number; public Car() { } public Car(String name) { //생성자 this.name = name; } public Car(String name, int number) { this.name = name; this.number = number; } public void run() { System.out.println("달리는 중"); } }
- 자식 클래스 Bus
클래스명 뒤에 "extends 부모클래스명"을 적어주면 부모 클래스가 갖고 있는 것들을 상속받을 수 있게 된다.public class Bus extends Car{ }
즉, 부모가 가지고 있는 것들을 자식이 사용할 수 있게 된다. - 상속 받은 메서드 사용하기
>>달리는 중public class BusExam { public static void main(String[] args) { Bus bus = new Bus(); bus.run(); } }
- Bus 확장하기
부모가 가지고 있는 메서드 외에 추가로 메서드를 선언하는 것을 확장하였다고 표현함.public class Bus extends Car{ public void ppangppang() { System.out.println("빵빵"); } }
부모클래스에선 사용할 수 없음.
public class BusExam { public static void main(String[] args) { Bus bus = new Bus(); bus.run(); bus.ppangppang(); Car car = new Car(); car.ppangppang; // 오류 } }
접근 제한자
: 클래스 내에서 멤버의 접근을 제한하는 역할
(캡슐화 : 관련된 내용을 모아서 가지고 있는 것)
접근 제한자의 종류
- public : 모든 접근 허용
- protected : 같은 패키지인 경우, 다른 패키지라도 상속을 받은 경우 접근 허용
- private : 자기 자신만 접근 가능( 모든 접근 불가)
- default : 아무것도 쓰지 않을 경우, 같은 패키지에서만 접근 가능
- AccessObj 클래스
public class AccessObj {
private int pri = 5;
int de = 2; // default
protected int pro = 7;
public int pub = 10;
}
- AccessObjExam 클래스
public class AccessObjExam {
public static void main(String[] args) {
AccessObj obj = new AccessObj();
System.out.println(obj.pri);
System.out.println(obj.de);
System.out.println(obj.pro);
System.out.println(obj.pub);
}
}
같은 패키지일 경우
- obj.pri : (private) 접근 불가능
- obj.de : (defalut) 같은 패키지 이므로 접근 가능
- obj.pro : (protect) 같은 패키지 이므로 접근 가능
- obj.pub : (public) 모든 접근 가능
다른 패키지의 경우
- obj.pri : (private) 접근 불가능
- obj.de : (defalut) 다른 패키지이므로 접근 불가능
- obj.pro : (protect) 다른 패키지이므로 접근 불가능
- obj.pub : (public) 모든 접근 가능
AccessObjExam클래스가 AccessObj의 자식 클래스일 경우(상속받은 경우)
- obj.pri : (private) 접근 불가능
- obj.de : (defalut) 다른 패키지이므로 접근 불가능
- obj.pro : (protect) 상속받은 패키지이므로 접근 가능
- obj.pub : (public) 모든 접근 가능
추상 클래스
: 구체적이지 않은 클래스.
독수리, 타조는 구체적으로 지칭하는데 새, 포유류 같은 것들은 구체적이지 않다. 이런 것들을 구현한 클래스
추상 클래스 정의 방법&특징
- 클래스 앞에 abstract 키워드를 사용하여 정의
- 미완성의 추상 메서드를 포함할 수 있다.
- 추상 메서드 : 내용이 없는 메서드. 즉, 구현이 되지 않은 메서드
- 방법 : 리턴 타입 앞에 abstact키워드 사용 ( {} 사용 X ) - 인스턴스를 생성할 수 없다
- 추상 클래스 생성
public abstract class Bird {
public abstract void sing();
public void fly() {
System.out.println("날다");
}
}
- Bird bird = new Bird(); 와 같은 인스턴스 생성은 불가능
- 추상 클래스 상속받는 클래스 생성
- 추상 클래스를 상속받은 클래스는 추상 클래스가 갖고 있는 추상 메서드를 반드시 구현해야 한다.
- 추상 클래스를 상속받고, 추상 클래스가 갖고 있는 추상 메서드를 구현하지 않으면 해당 클래스도 추상 클래스
public class Duck extends Bird{
public void sing(){
System.out.println("꿱꿱");
}
}
- 사용
public class DuckExam { public static void main(String[] args) { Duck duck = new Duck(); duck.sing(); } }
super와 부모 생성자
: class가 인스턴스화 될 때 생성자가 실행되면서 객체의 초기화를 한다. 그때 자신의 생성자만 실행이 되는 것이 아니고, 부모의 생성자부터 실행된다.
- 부모 생성자
public class Car { String name; int number; public Car() { System.out.println("Car 기본 생성자"); } }
- 자식 생성자
public class Bus extends Car{ public Bus(){ System.out.println("Bus의 기본생성자"); } }
- 생성자 테스트
>>public class BusExam { public static void main(String[] args) { Bus bus = new Bus(); } }
Car 기본 생성자
Bus의 기본 생성자
- new연산자로 Bus객체 생성 시, Bus객체가 메모리에 저장될 때 부모인 Car도 함께 메모리에 저장
- 생성자는 객체를 초기화하는 일을 함.
- 생성자가 호출될 때 자동으로 부모의 생성자가 호출되면서 부모 객체를 초기화하게 된다.
super
- 부모 클래스를 가리키는 키워드
- 자식 클래스에서 부모의 메서드나 필드를 사용할 때 사용
- super() : 부모의 생성자
- 부모의 생성자를 임의로 호출하지 않으면, 부모 클래스의 기본 생성자가 자동으로 호출됨.
public class Bus extends Car{ public Bus(){ super(); System.out.println("Bus의 기본생성자"); } }
부모의 기본 생성자가 아닌 다른 생성자를 호출하는 방법
- 클래스는 기본 생성자가 없는 경우도 존재
- Car 클래스가 해당 코드로 수정되면, Bus 생성자에서 오류가 발생.public class Car { String name; int number; public Car(String name) { //생성자 this.name = name; System.out.println("Car(" + name + ") 생성자"); } }
- 원인 : 부모 클래스에 기본 생성자가 없기 때문에 컴파일 오류가 발생
- 해결방법 : 자식 클래스의 생성자에서 직접 부모의 생성자를 호출.public class Bus extends Car{ public Bus(){ super("소방차"); System.out.println("Bus의 기본생성자"); } }
반응형
'Language > Java' 카테고리의 다른 글
자바 입문하기15 - 인터페이스 (0) | 2022.01.12 |
---|---|
자바 입문하기14 - 클래스 형변환 (0) | 2022.01.11 |
자바 입문하기12 - 오버로딩, 오버라이딩, this(), 패키지 (0) | 2022.01.11 |
자바 입문하기11 - 생성자, this (0) | 2022.01.11 |
자바 입문하기10 - scope, static, enum (0) | 2022.01.10 |