1. classOne 클래스
1) 생성자(Constructor)
public classOne(int a, int b) {
this.a = a;
this.b = b;
}
생성자는 객체가 생성될 때 호출되는 특별한 메서드로, 클래스 이름과 동일한 이름을 가진다.
이 생성자는
a,
b 값을 받아서, 클래스 내부의 멤버 변수a
, b 값을 초기화한다.객체 생성 시 호출한다
2) print 메서드
public void print() {
System.out.println(a + b);
}
print 메서드 호출 시 두 멤버 변수
a
와b
의 합을 출력한다.
2. classTwo 클래스
1) classTwo 클래스는 classOne 클래스를 상속 받았다
class classTwo extends classOne {
int po = 3;
public classTwo(int i) {
super(i, i+1);
}
public void print() {
System.out.println(po*po);
}
}
상속받았으므로 부모 클래스인
classOne
의 기능을 확장하거나 재정의 할 수 있다
2) 생성자 (Constructor)
public classTwo(int i) {
super(i, i+1);
}
classTwo
는classOne
을 상속받았기 때문에, 부모 클래스의 생성자를 호출하는 구조super(i, i+1)
은classOne(int a, int b)
생성자를 호출하는 구문으로,a
는i
로,b
는i + 1
로 초기화된다
3) print 메서드 (overriding)
public void print() {
System.out.println(po * po);
}
classTwo
는classOne
의print()
메서드를 오버라이딩(재정의)한다.즉, 부모 클래스의
print()
메서드를 대신해서 자신의print()
메서드를 실행하도록 재정의한다.‘po’ 라는 멤버 변수의 제곱값을 출력한다.
3. Overriding, Overloading 개념 정리
오버라이딩 (Overriding)
오버라이딩은 상속 관계에서 발생하는 개념으로, 부모 클래스에서 정의된 메서드를 자식 클래스에서 재정의하는 것을 말합니다.
즉, 부모 클래스의 메서드와 동일한 이름, 매개변수, 반환 타입을 가진 메서드를 자식 클래스에서 다시 구현하는 것입니다. 오버라이딩을 통해 자식 클래스는 부모 클래스의 기본 동작을 변경하거나 확장할 수 있습니다.
주요 특징
- 메서드의 이름, 매개변수, 반환 타입이 부모 클래스와 동일해야 함.
- 자식 클래스에서 부모의 메서드 동작을 변경함.
- 동적 바인딩으로, 실제 객체 타입에 따라 호출되는 메서드가 결정됨.
오버로딩 (Overloading)
오버로딩은 같은 클래스 내에서 같은 이름의 메서드를 다른 매개변수로 여러 개 정의하는 것을 의미합니다.
오버로딩된 메서드는 매개변수의 개수나 타입이 다르기 때문에, 호출 시 전달되는 인자의 형태에 따라 적절한 메서드가 선택됩니다. 이는 같은 작업을 하지만 입력 방식이 다른 경우에 유용하게 사용됩니다.
주요 특징
- 메서드의 이름은 같지만, 매개변수의 타입, 개수, 순서가 달라야 함.
- 반환 타입은 달라도 되지만, 메서드 오버로딩의 기준은 매개변수에 있음.
- 정적 바인딩으로, 컴파일 시점에 어떤 메서드가 호출될지 결정됨.
요약
- 오버라이딩: 상속 관계에서 부모 클래스의 메서드를 자식 클래스에서 재정의하는 것.
- 오버로딩: 같은 클래스 내에서 이름은 같지만 매개변수가 다른 메서드를 여러 개 정의하는 것.
4. main 함수에서의 다형성
자, 이제 내가 이 포스팅을 작성하려는 이유가 나온다. main 함수를 이해하지 못했는데 제대로 기억하기 위해 글을 쪄본다…
먼저main
함수에서 사용된 다형성(polymorphism) 개념은 객체 지향 프로그래밍(OOP)의 중요한 특징 중 하나로, 부모 클래스 타입의 변수가 자식 클래스 객체를 참조할 수 있는 성질을 뜻한다.
1) upcasting
classOne one = new classTwo(10);
여기서 one
은 classOne
타입이지만, 실제로는 classTwo
의 객체를 참조하고 있다. 이것을 업캐스팅이라고 한다. 업캐스팅은 자식 클래스의 객체가 부모 클래스의 타입으로 취급되는 상황이다.
2) 오버라이딩과 다형성
one.print();
여기서 one의 타입은 classOne이지만, 실제론 classTwo의 객체를 참조하기 때문에 classTwo
에서 오버라이딩된 print()
메서드가 호출된다.
이 과정에서 동적 바인딩(dynamic binding)이 일어나, 실제 객체의 타입(여기서는 classTwo
)에 맞는 메서드가 실행된다.
즉, 컴파일 시점에는 classOne
의 print()
를 호출할 것처럼 보이지만, 런타임 시점에는 실제 객체 타입인 classTwo
의 print()
가 호출된다.
그래서 정답은 9이다.
🧐 그래서 다형성이 뭔데…?
chatGPT 4o mini : 업캐스팅(Upcasting)은 다형성(Polymorphism)을 구현하는 방법 중 하나입니다. 업캐스팅은 다형성을 가능하게 만드는 기법이지만, 다형성은 그보다 더 넓은 개념이에요. 다형성은 객체가 여러 형태를 가질 수 있는 능력을 말하는 것이고, 그중 하나의 구현 방법이 업캐스팅입니다.