728x90
반응형
프로그래머스 자바 입문 강의를 학습 목적으로 정리하여 포스팅합니다.
1. 상속
상속이란 부모가 가진 것을 자식에게 물려주는 것을 의미
// 클래스 선언
public class Car{
public void run(){
System.out.println("달리다.");
}
}
// extends 부모클래스명
public class Bus extends Car{
public void ppangppang(){
System.out.println("빵빵");
}
}
// Car를 상속받은 Bus 인스턴스화
// Bus class는 아무런 코드를 가지고 있지 않지만 run 메소드 사용에 문제 없음
public class BusExam{
public static void main(String args[]){
Bus bus = new Bus();
bus.run();
}
}
2. 접근 제한자
접근 제한자란 클래스 내에서 멤버의 접근을 제한하는 역할
- public
어떤 클래스든 접근 가능
- protected
자기 자신, 같은 패키지, 서로 다른 패키지라 하더라도 상속받은 자식 클래스에서는 접근 가능
- private
자기 자신만 접근 가능
- default
자기자신과 같은 패키지에서만 접근 가능
3. 추상 클래스
추상 클래스란 구체적이지 않은 클래스를 의미
추상 클래스 정의 방법
- 추상 클래스는 클래스 앞에 abstract 키워드를 이용
- 추상 클래스는 미완성의 추상 메소드를 포함할 수 있음
추상 메소드란, 내용이 없는 즉 구현이 되지 않은 메소드
추상 메소드는 리턴 타입 앞에 abstract라는 키워드 이용
- 추상 클래스는 인스턴스(객체) 생성 불가능
public abstract class Bird{
public abstract void sing();
public void fly(){
System.out.println("날다.");
}
}
추상 클래스를 상속받는 클래스 생성 방법
- 추상 클래스를 상속받은 클래스는 추상 클래스가 갖고 있는 추상 메소드를 반드시 구현해야 함
- 추상 클래스를 상속받고, 추상 클래스가 갖고 있는 추상 메소드를 구현하지 않으면 해당 클래스도 추상 클래스가 됨
public class Duck extends Bird{
@Override
public void sind(){
System.out.println("꽥꽥!!");
}
}
4. super와 부모 생성자
public class Car{
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 b = new Bus();
}
}
// Car의 기본생성자입니다.
// Bus의 기본생성자입니다.
- new 연산자로 Bus 객체를 생성하면, Bus 객체가 메모리에 올라갈 때 부모인 Car도 함께 메모리에 올라감
- 생성자는 객체를 초기화하는 일을 수행
- 생성자가 호출될 때 자동으로 부모의 생성자가 호출되면서 부모객체를 초기화하게 됨
super
- 자신을 가리키는 키워드 this, 부모를 가리키는 키워드 super
- super()는 부모의 생성자를 의미
- 부모의 생성자를 임의로 호출하지 않으면, 부모 class의 기본 생성자가 자동으로 호출됨
public Bus(){
super();
System.out.println("Bus의 기본생성자입니다.");
}
- 부모의 기본생성자가 아닌 다른 생성자를 호출하는 방법
public class Car{
public Car(String name){
System.out.println(name + "을 받아들이는 생성자입니다.");
}
}
public Bus(){
super("소방차");
System.out.println("Bus의 기본생성자입니다.");
}
- 자식에서 부모의 메소드나 필드를 사용할 경우도 사용
5. 오버라이딩
오버라이딩이란 부모가 가지고 있는 메소드와 똑같은 모양의 메소드를 자식이 가지고 있어서 메소드 재정의가 가능
// 부모 클래스 Car
public class Car{
public void run(){
System.out.println("Car의 run메소드");
}
}
// 자식 클래스 Bus
public class Bus extends Car{
// 오버라이딩한 자식의 메소드
public void run(){
super.run(); // 부모의 run 메소드 호출 가능
System.out.println("Bus의 run메소드");
}
}
6. 클래스 형변환
부모 타입으로 자식 객체를 참조하게 되면 부모가 가지고 있는 메소드만 사용 가능
자식 객체가 가지고 있는 메소드나 속성을 사용하고 싶은 경우 클래스 형변환
// 부모 클래스 Car
public class Car{
public void run(){
System.out.println("Car의 run메소드");
}
}
// 자식 클래스 Bus
public class Bus extends Car{
public void ppangppang(){
System.out.println("빵빵");
}
}
// 부모 → 자식 형변환
public class BusExam{
public static void main(String args[]){
Car car = new Bus(); // 자식 타입을 참조하는 부모
car.run();
// car.ppangppang(); 은 컴파일 오류 발생
Bus bus = (Bus)car; // 부모타입->자식타입 형변환
bus.run();
bus.ppangppang();
}
}
- 상속관계일 경우 객체들끼리도 형변환 가능
- 부모 타입으로 자식 타입의 객체를 참조할 때는 묵시적 형변환
- 부모 타입의 객체를 자식 타입으로 참조하게 할 때는 명시적 형변환. 단 부모가 참조하는 인스턴스가 형변환하려는 자식 타입일 때만 가능
728x90
반응형
'JAVA > [프로그래머스] 자바 강의' 카테고리의 다른 글
[프로그래머스] 자바 입문 강의 part9. 예외처리 (0) | 2023.01.16 |
---|---|
[프로그래머스] 자바 입문 강의 part8. 인터페이스와 다른 형식의 클래스 (1) | 2023.01.16 |
[프로그래머스] 자바 입문 강의 part6. 클래스 다듬기 (1) | 2023.01.16 |
[프로그래머스] 자바 입문 강의 part5. 클래스와 객체 (1) | 2023.01.16 |
[프로그래머스] 자바 입문 강의 part4. 배열 (0) | 2023.01.16 |