오버라이딩은 상속이 되어야 가능하다. 상속이 없으면 오버라이딩은 성립할 수 없다.
생성자
클래스 이름과 동일한 명칭을 가지고 있는 메서드이다. 그러면 Parent 클래스에서는 Parent 메서드가 생성자이고, Child 클래스에서는 Child 메서드가 생성자이다.
상속
class A{ }
class B extends A { }
상속할 때 B extends A를 보고 B는 자식이고, B의 부모는 A구나를 알 수 있다. 이것은 상속이지 오버라이딩이 아니다.
오버라이딩(overriding)
상속 관계여야 오버라이딩이 가능하다.
class A {
void fn(){};
}
class B extends A{
void fn(){};
}
보면 A랑 B랑 상속 관계인데, 메서드가 fn이 똑같이 있다. 이게 오버라이딩이다.
※오버라이딩일 때는 자식 클래스의 메소드 사용 - 하위 클래스의 오버라이딩 메소드는 상위 클래스 메소드보다 우선순위가 높다.
번외) 오버로딩(overloading)
-> 메소드 이름은 동일하지만 인수를 받는 자료형과 개수가 다르면 서로 다른 메소드다.
이름은 같지만 자료형, 개수를 다르게하여 여러 기능을 정의하는 것이 오버로딩이다.
ex)
class A {
void fn(){};
}
class B extends A{
void fn(int x){};
}
class Parent{
public Parent{
System.out.printIn("부모생성자");
}
public void fn{
System.out.printIn("오버라이딩 - 부모 클래스의 fn 메서드");
}
}
class Child extends Parent{
public Child{
System.out.printIn("자식 생성자");
}
public void fn{
System.out.printIn("오버라이딩 - 자식 클래스의 fn 메서드");
}
}
public class Soojebi{
public static void main(String args[]){
Child c = new Child();
c.fn();
}
}
1. Child c = new Child(); 에서 new 키워드에 의해 클래스의 생성자가 호출된다. 이 생성자의 호출 순서는 부모 클래스의 생성자 -> 자식 클래스의 생성자이므로 부모 클래스의 Parent의 Parent 메서드를 호출하고, 그 다음에 자식 클래스인 Child 의 Child 메서드를 호출한다.
2. 다음으로 c.fn(); , c는 Child 클래스를 저장하는 인스터스(변수)이므로 fn이라는 메서드를 호출해야 하는데, 부무도 fn 메서드가 있고, 자식도 fn 메서드가 있을 때, 즉 오버라이딩일 때는 자식 클래스의 메서드를 호출해야하므로 Child에 있는
fn 메서드를 호출한다.
* 다른 경우
Parent P = new Child() 인 경우
- Parent 생성자 -> Child 생성자
Parent P = new Parent() 인 경우
- Parent 생성자 -> 부모메서드
Child c = new Child(); 인 경우
- Parent 생성자 -> Child 생성자
정답
부모 생성자
자식 생성자
오버라이딩 - 자식 클래스의 fn 메서드
abstract class Vehicle{
String name;
abstract public String getName(String val);
public String getName(){
return "Vehicle name :" + name;
}
}
class Car extends Vehicle{
public Car(String val){
name = super.name = val;
}
public String getName(String val){
return "Car name :" + val;
}
public String getName(byte val[]){
return "Car name :" + val;
}
}
public class Test{
public static void main(String[] args){
Vehicle obj = new Car("Spark");
System.out.printf(obj.getName());
}
}
부모 클래스에 생성자를 따로 구현하지 않으면 Vehicle(){ }처럼 파라미터를 받지 않고, 내부에서 아무 기능을 하지 않는 생성자가 자동으로 생성된다.
일단 생성자는 부모 -> 자식 순으로 진행이 되는데, new Car하고 아무 값도 넘기지 않았다면
Vehicle 클래스의 파라미터가 없는 생성자 -> Car 클래스의 파라미터가 없는 생성자가 호출된다.
근데 파라미터가 담긴 new Car("Spark")라고 하면 Car 클래스에서 생성자 중 Spark라는 것을 매개변수로 받을 수 있는 Car(String val)이 호출된다. 이 때 생성자 호출 순서는
Vehicle 클래스의 파라미터가 없는 생성자 -> Car 클래스의 파라미터가 있는 Car(String val) 생성자가 호출된다.
obj.getName() 는 getName에 파라미터가 없으므로 부모 클래스의 getName() 메서드를 실행하게 된다.
정답
Vehicle name: Spark
class Parent{
public Parent( ){
System.out.println("부모 생성자1");
}
public Parent(String s){
System.out.println("부모 생성자2");
}
}
class Child extends Parent{
public Child( ){
System.out.println("자식 생성자1");
}
public Child(String s){
System.out.println("자식 생성자2");
}
}
public class Soojebi{
public static void main(String args[]){
Child c = new Child("Hello");
}
}
부모 클래스 생성자는 따로 명시해주지 않으면 파라미터가 없는 Parent( )이고 자식 클래스 생성자는 Child("Hello")라고 했으니깐 Child(String s)가 호출된다.
정답
부모 생성자1
자식 생성자2
class Parent{
public Parent( ){
System.out.println("부모 생성자1");
}
public Parent(String s){
System.out.println("부모 생성자2");
}
}
class Child extends Parent{
public Child( ){
System.out.println("자식 생성자1");
}
public Child(String s){
super(s); // --------------윗 댓글 코드에서 이게 추가됐어요.
System.out.println("자식 생성자2");
}
}
public class Soojebi{
public static void main(String args[]){
Child c = new Child("Hello");
}
}
부모 클래스 생성자는 따로 명시해주지 않으면 파라미터가 없는 Parent( )가 호출되어야 하지만 자식 클래스 중에서 지금 호출하려고 하는 Child(String s)에 super라고 명시해주었기 때문에 Parent(String s)가 호출됩니다. 자식은 Child(String s)가 호출된다.
※ super : 상속한 부모 클래스를 가리키는 예약어
※ this : 현재 실행중인 메소드가 속한 클래스를 가리키는 예약어
정답
부모 생성자2
자식 생성자2
class Parent{
Parent( ){
System.out.print("부모 생성자1");
}
}
class Child extends Parent{
Child( ){
System.out.print("자식 생성자1");
}
}
public class Soojebi{
public static void main(String args[]){
new Child();
}
}
정답
부모 생성자1 자식 생성자 1
참고자료
[출처] 생성자 vs 오버라이딩(클래스 상속이 헷갈리는 분들 필독!) (수제비- IT 커뮤니티 (정보처리기사,빅데이터분석기사, ADsP등)) | 작성자 두음쌤
'기타 > 정보처리기사' 카테고리의 다른 글
비전공자 정보처리기사 실기 합격 후기 (feat.3트째 성공 ) (1) | 2024.06.18 |
---|---|
2진수, 8진수, 10진수, 16진수/ bit와 byte (0) | 2023.08.02 |
4장 - 네트워크 계층 (7계층) (0) | 2023.08.02 |
4장 - python의 활용 (0) | 2023.05.07 |
4장 - 프로그래밍 언어 활용(printf()함수) (0) | 2023.04.20 |