안녕하세요 다들 주말 잘보내셨나요 ~ 저는 학교다닐때도 안했던 공부를 주말에 카페와서 하고있습니다 ..(뿌듯😊😊😊) 오늘은 상속에 대해서 공부를 해볼 예정입니다. 맨날 클래스는 하나인데 오른쪽에 영어로 쏼라쏼라 뱀처럼 붙어있는걸 보고 이게뭐지..? 라고 생각했는데 오늘 드디어 제대로 배워보겠습니다..!
오늘은 오랜만에 카페에서 공부하는 기분 살릴겸 자주듣는 곡하나 올리겠습니다.
오늘도 열심히 공부 시작해볼게요 ^_____^
✅ 00. 상속(Ingeritance)
상속이란?
상속(Ingeritance)은 부모가 자식에게 물려주는 행위를 말합니다. 객체 지향 프로그램에서도 부모 클래스의 필드와 메소드를 자식 클래스에게 물려줄 수 있습니다.
다음 예제를 보겠습니다. 먼저 부모클래스가 되어줄 Phone이라는 클래스를 생성했습니다. 기존 공부했던 클래스에서 사용했던 리턴값이 없는 void를 사용하여 bell, sendVoice, receiveVoice, hangup 메소드를 선언했습니다.
다음은 부모클래스를 물려받은 SmartPhone 이라는 자식클래스입니다. 제가 앞에서 언급했듯이 SmartPhone 옆에 extends를 사용해서 부모클래스인 Phone 클래스를 상속받았습니다.
따라서, 자식클래스에서는 부모클래스의 모든 정보를 사용할 수 있습니다.
마지막으로 모든 클래스를 호출받을수 있는 클래스입니다. new연산자를 사용해서 Sp라는 객체를 생성했습니다, 그 후에는 앞에서 했듯이 도트연산자(.)를 사용하여 자식,부모 클래스의 필드를 읽고 메소드를 호출받을 수 있습니다.
※ 단, 새로운 객체를 만들때는 모든 정보를 가지고 있는 자식클래스를 호출해야합니다.
✅ 01. 메소드 재정의
오버라이딩이란?
부모 클래스의 모든 메소드가 자식 클래스에게 맞게 설계되어 있다면 가장 이상적인 상속이지만, 어떤 메소드는 자식 클래스가 사용하기에 적합하지 않을 수 있다. 이러한 메소드는 자식 클래스에서 재정의해서 사용해야 합니다. 이것을 메소드 오버라이딩 이라고 합니다.
이처럼 메소드가 오버라이딩되었다면 해당 부모 메소드는 숨겨지고 자식 메소드가 우선적으로 사용됩니다.
메소드를 오버라이딩할 때는 다음과 같은 규칙에 주의해서 작성해야 합니다.
· 부모 메소드의 선언부(리턴 타입, 메소드 이름, 매개 변수)와 동일해야한다.
· 접근 제한을 더 강하게 오버라이딩할 수 없다(public → private으로 변경 불가)
· 새로운 예외를 throws할 수 없다.
다음 예제를 보겠습니다. 먼저 부모클래스가 되어줄 Calculator이라는 클래스를 생성했습니다. 원이 넓이를 구하는 areaCircle() 메소를 가지고 있습니다. 하지만 원주율 파이가 정확하지 않기 때문에 자식 클래스인 Computer에서 오버라이딩해서 좀 더 정확한 원주율 파이 상수(Math.PI)를 사용해 원의 넓이를 구하도록 했습니다.
결과를 확인해보면 오버라이딩 규칙을 위배하지 않았기 때문에 결과값이 출력됐으며, 자식 클래스인 Computer결과를 보면 좀 더 정확한 원의 넓이가 나온것을 확인할 수 있습니다.
✅ 02. 부모 메소드 호출
super.method란?
메소드를 재정의하면, 부모 메소드는 숨겨지고 자식 메소드만 사용되기 때문에 부모 메소드의 일부만 변경된다 하더라도 중복된 내용을 자식 메소드도 가지고 있어햐 합니다, 그런데 부모 메소드가 길고 자식 메소드에서는 1줄만 추가 하고 싶을때 부모 메소드의 코드를 자식 메소드에서 다시 작성해야합니다.
이 문제를 해결하기위해 자식 메소드 내에서 부모 메소드를 호출하는 것인데, 다음과 같이 super 키워드와 도트(.) 연산자를 사용하면 숨겨진 부모 메소드를 호출할 수 있습니다.
이번 예제는 Airplane의 fly() 메소드를 자식 클래스인 Super Airplane에서 오버라이딩을 하였습니다.
따라서 일반 비행 모드일 때는 Airplane의 fly()를 사용하고, 초고속 비행일때는 오버라이딩된 Super Airplane 의 fly() 가 사용됐습니다.
✅ 03. final 클래스와 메소드
final 클래스란?
클래스를 선언할 때 final 키워드를 class 앞에 붙이면 최종적인 클래스이므로 더 이상 상속을 할 수 없습니다. 즉 final 클래스는 부모 클래스가 될 수 없어 자식 클래스를 만들 수 없습니다.
final 메소드란?
메소드를 선언할 떄 final 키워드를 붙이면 이 메소드는 최종적인 메소드이므로 오버라이딩할 수 없는 메소드가 됩니다. 즉 부모 클래스를 상속해서 자식 클래스를 선언할 때, 부모 클래스에 선언된 final 메소드는 자식 클래스에서 재정의할 수 없습니다.
✅ 04. 타입 변한
자동 타입 변환이란?
자동 타입 변환은 자동적으로 타입 변환이 일어나는 것을 말합니다.
강제 타입 변환이란?
자식 타입은 부모 타입으로 자동 변환되지만, 반대로 부모 타입은 자식 타입으로 자동 변환되지 않습니다. 대신 다음과 같이 캐스팅 연산자로 강제 타입 변환을 할 수 있습니다.
✅ 05. 객체 타입 확인
객체 타입이란?
매개변수가 아니더라도 변수가 참조하는 객체의 타입을 확인하고자 할 때, instanceof 연산자를 사용 할 수 있다. instanceof 연산자의 좌항에는 객체가 오고 우항에는 타입이 오는데, 좌항의 객체가 우항의 타입이면 true를 산출하고 그렇지 않으면 false를 산출한다.
이번 예제는 personInfo() 메소드의 매개값으로 Student를 제공했을 경우에만 studentNo를 출력하고 study() 메소드를 호출하는 것을 확인합니다.
이처럼 person이 참조하는 객체가 Student 타입일 경우 personInfo매개값으로 Student를 제공하여 결과값에 출력되었습니다.
✅ 06. 추상 클래스
추상클래스란?
객체를 생성할 수 있는 클래스를 실체 클래스라고 한다면, 이 클래스들의 공통적인 필드나 메소드를 추출해서 선언한 클래스를 추상 클래스라고 합니다. 추상 클래스는 실체 클래스의 부모 역할을 합니다.
추상 클래스는 실체 클래스의 공통되는 필드와 메소드를 추출해서 만들었기 때문에 new 연산자를 사용해서 객체를 직접 생성할 수는 없습니다.
Animal animal = new Animal(); //x
추상 클래스는 새로운 실체 클래스를 만들기 위한 부모 클래스로만 사용됩니다. 즉, 추상 클래스는 extends 뒤에만 올 수 있습니다.
추상클래스 선언
클래스 선언에 abstract 키워드를 붙이면 추상 클래스 선언이 됩니다. 추상 클래스는 new 연산자를 이용해서 객체를 직접 만들지 못하고 상속을 통해 자식 클래스만 만들 수 있습니다.
public abstract class 클래스명 {
//필드
//생성자
//메소드
}
추상 클래스도 필드, 메소드를 선언할 수 있습니다. 그릭 자식 객체가 생성될 때 super()로 추상 클래스의 생성자가 호출되기 때문에 생성자도 있어야합니다.
다음 예제는 새로운 전화기 클래스는 추상 클래스인 Phone으로부터 공통 필드와 메소드를 물려받고 Phone을 상속해서 SmartPhone을 설계한 것입니다.
Phone 객체는 new 연산자로 직접 생성할 수는 없지만 자식 객체인 SmartPhone은 new 연산자로 객체 생성이 가능하고, Phone으로부터 물려받은 turnOn() 과 turnOff()메소드를 호출할 수 있습니다.
끝!
'Java' 카테고리의 다른 글
12. Java - 제네릭(Generic) (0) | 2024.07.02 |
---|---|
11. Java - 예외처리 (1) | 2024.06.25 |
09. Java - 클래스(3)_인스턴스/정적멤버 (1) | 2024.05.10 |
08. Java - 클래스(2)_실습편 (0) | 2024.05.10 |
07. Java - 클래스(1)_이론편 (0) | 2024.05.09 |