단, 이 세 가지 개념은 생성자, 상속 이라는 개념을 알고 있어야만 이해 가능합니다.
[Java] 예시 코드로 쉽게 이해하는 자바의 상속 & 생성자
1. 상속 1) 개념 - 부모클래스의 멤버 변수, 멤버 메서드를 자식 클래스가 상속 받아 사용 - 클래스 재사용 => 중복 코드 줄여서 효율성 증대 2) 특징 - '자식클래스 extends 부모클래스'
awesomepossum.tistory.com
1. 메서드 오버로딩
= 메서드 중복 정의, 계산기
- 같은 이름의 메서드를 인자만 다르게 하여 중복 정의
- 메서드의 이름이 같아야 하고, 인자의 개수나 타입이 틀려야 한다.
- 리턴 값만 다른 것은 오버로딩 할 수 없음
쉽게 말해 계산기 생각하면 됨
여러분이 계산기를 개발한다고 생각 했을 때
정수인 100 + 200 을 하면 300 값을 반환하지만
실수인 100.0 + 200.0 을 하게 되면 300.0 값을 반환하게 프로그램을 짜려고 합니다
그럼 같은 덧셈을 수행하는 메서드라도 인자값이 정수 두 개, 실수 두 개로 다르게 만들어지겠죠?
이게 바로 메서드 오버로딩
ㅁ 메서드 오버로딩 예시 (계산기)
class Calculate [
public int cal(int a, int b) {
return a - b;
}
public float cal(floa a, float b) {
return a - b;
}
public double cal(double a, double b) {
return a + b;
}
public cal(int a + int b + int c) {
return a + b + c;
}
class Example {
public static void main(String[] args) {
Calculate a = new Calculate();
System.out.print( a.cal(31, 69, 25) + "," );
System.out.print( a.cal(24.8, 5.1) );
}
}
결과값 125, 29.9
인자값 3개인 건 인자값 3개 들어있는 메서드 태우고
인자값이 실수인 것은 실수 메서드 태워서 실수 반환
2. 메서드 오버라이딩
= 메서드 재정의, 아버지처럼 살기 싫어요~!
- 상속 관계에서 부모 클래스에서 정의된 메서드를 다시 재정의
- 추상 클래스나 인터페이스를 상속 받을 때 사용되는 개념
- 부모 메서드의 이름, 리턴타입, 매개변수의 개수와유형이 완전히 동일해야 한다.
메서드 오버라이딩은 "아버지처럼 살기 싫어요!" 라구 기억하시면 됩니다~
나와 아버지가 동일한 이름의 메서드를 가지고 있어도 자식은 내 메서드에 있는 기능을 수행한다는 것입니다.
쉽게 말해 Animal(동물) 이라는 상위 클래스를 만들고
Cat(고양이), Dog(개) 등의 하위 클래스가 Animal을 상속받은 경우
동물별로 울음소리가 달라야 겠죠? 고양이는 '야옹', 개는 '멍멍' 짖어야 겠죠~
즉, 이름이 같은 같은 speak() 메서드가 Animal에 있어도 개나 고양이는 자신 고유의 울음소리를 구현한다는 것입니다.
ㅁ 메서드 오버라이딩 예시 (동물 울음소리)
class Animal {
public void speak() {
System.out.println("동물 울음소리")
}
}
class Dog extends Animal {
public void speak() {
System.out.println("멍멍!");
}
}
class Cat extends Animal {
public void speak() {
System.out.println("야옹~");
}
}
class Main {
public static void main(String args[]) {
Dog dog = new Dog();
Cat cat = enw Cat();
dog.speak();
cat.speak();
}
}
결과값:
멍멍!
야옹~
3. 하이딩
= static 메서드 관련
- 상위 클래스의 static 메서드를 하위 클래서에서 같은 유형으로 다시 선언
- 하이딩된 메서드는 메서드 호출이 클래스 타입에 따라 결정
ex) Parent a = new Child(); 일 때 instance a의 타입이 Parent이므로 Parent의 메서드 호출
무슨 말인지 어려우시면 아래 코드 보시면 알게 됩니다
하이딩 예시
class A {
public void f() { System.out.print("1 "); }
public static void g() { System.out.print("2 "); }
}
class B extends A {
public void f() { System.out.print("3 "); }
public static void g() { System.out.print("4 "); }
}
class
C extends B {
public void f() { System.out.print("5 "); }
public static void g() { System.out.print("6 "); }
}
class D {
public static void main(String args[]) {
A obj = new C();
obj.f();
obj.g();
System.out.println();
B obj1 = new C();
obj1.f();
obj1.g();
}
}
출력값:
5 2
5 4
main에서 두 개의 인스턴스 obj, obj1생성
A obj = new C();
B obj1 = new C();
상속관계 A -> B -> C
각 클래스는 두 개의 메서드 가지는데 메서드 이름이 같고, 매개변수 동일하기 때문에 메서드 오버라이딩 형태로 보여짐
메서드 f() 은 일반 메서드인데, g() 는 static 메서드
f() 의 경우 오버라이딩에 따라 상속받은 하위 클래스의 메서드를 수행
obj.f()는 최종 상속받은 하위클래스 C에 있는 f() 수행
obj1.f()도 C를 참조하므로 C에 있는 f() 수행
g() 는 인스턴스의 클래스 타입에 따라 결정됨 <
obj.g() => obj는 A타입 변수이므로 A가 가진 g() 호출
obj1.g() => obj1은 B타입 변수이므로 B가 가진 g() 호출
예제 - 하이딩 안 되는 경우
상위 클래스와 하위 클래스 모두 같은 static 메서드여야 하이딩이 됨
class A {
public void f() { System.out.print("1 "); }
public static void g() { System.out.print("2 "); }
}
class B extends A {
public void f() { System.out.print("3 "); }
public void g() { System.out.print("4 "); }
}
class D {
public static void main(String aprgs[]) {
A obj = new B();
obj.f();
obj.g(); // 여기서 오류
}
}
위 코드는 오류발생
왜? g()메서드의 경우 상위 클래스 A는 static메서드로 선언되었으나 A를 상속 받은 하위클래스 B에서는 일반 클래스로 생성되어 있기 때문에 오류가 발생
'ETC > 정보처리기사' 카테고리의 다른 글
[정보처리기사] 서브넷 마스크 오답정리 (3) | 2025.03.26 |
---|---|
[정보처리기사] 디스크 스케줄링(FCFS, SSTF, SCAN, CSAN, LOOK, C-LOOK) & RAID (1) | 2025.03.16 |
[Java] 정보처리기사 자바의 상속 & 생성자 (3) | 2024.10.23 |
[Java] 자바의 예외처리 키워드, 예시, 종류 정리 (1) | 2024.10.18 |
[Java] 정보처리기사 추상클래스 / 인터페이스 정리 (오류 발생 문제 풀이) (3) | 2024.10.18 |
단, 이 세 가지 개념은 생성자, 상속 이라는 개념을 알고 있어야만 이해 가능합니다.
[Java] 예시 코드로 쉽게 이해하는 자바의 상속 & 생성자
1. 상속 1) 개념 - 부모클래스의 멤버 변수, 멤버 메서드를 자식 클래스가 상속 받아 사용 - 클래스 재사용 => 중복 코드 줄여서 효율성 증대 2) 특징 - '자식클래스 extends 부모클래스'
awesomepossum.tistory.com
1. 메서드 오버로딩
= 메서드 중복 정의, 계산기
- 같은 이름의 메서드를 인자만 다르게 하여 중복 정의
- 메서드의 이름이 같아야 하고, 인자의 개수나 타입이 틀려야 한다.
- 리턴 값만 다른 것은 오버로딩 할 수 없음
쉽게 말해 계산기 생각하면 됨
여러분이 계산기를 개발한다고 생각 했을 때
정수인 100 + 200 을 하면 300 값을 반환하지만
실수인 100.0 + 200.0 을 하게 되면 300.0 값을 반환하게 프로그램을 짜려고 합니다
그럼 같은 덧셈을 수행하는 메서드라도 인자값이 정수 두 개, 실수 두 개로 다르게 만들어지겠죠?
이게 바로 메서드 오버로딩
ㅁ 메서드 오버로딩 예시 (계산기)
class Calculate [ public int cal(int a, int b) { return a - b; } public float cal(floa a, float b) { return a - b; } public double cal(double a, double b) { return a + b; } public cal(int a + int b + int c) { return a + b + c; } class Example { public static void main(String[] args) { Calculate a = new Calculate(); System.out.print( a.cal(31, 69, 25) + "," ); System.out.print( a.cal(24.8, 5.1) ); } }
결과값 125, 29.9
인자값 3개인 건 인자값 3개 들어있는 메서드 태우고
인자값이 실수인 것은 실수 메서드 태워서 실수 반환
2. 메서드 오버라이딩
= 메서드 재정의, 아버지처럼 살기 싫어요~!
- 상속 관계에서 부모 클래스에서 정의된 메서드를 다시 재정의
- 추상 클래스나 인터페이스를 상속 받을 때 사용되는 개념
- 부모 메서드의 이름, 리턴타입, 매개변수의 개수와유형이 완전히 동일해야 한다.
메서드 오버라이딩은 "아버지처럼 살기 싫어요!" 라구 기억하시면 됩니다~
나와 아버지가 동일한 이름의 메서드를 가지고 있어도 자식은 내 메서드에 있는 기능을 수행한다는 것입니다.
쉽게 말해 Animal(동물) 이라는 상위 클래스를 만들고
Cat(고양이), Dog(개) 등의 하위 클래스가 Animal을 상속받은 경우
동물별로 울음소리가 달라야 겠죠? 고양이는 '야옹', 개는 '멍멍' 짖어야 겠죠~
즉, 이름이 같은 같은 speak() 메서드가 Animal에 있어도 개나 고양이는 자신 고유의 울음소리를 구현한다는 것입니다.
ㅁ 메서드 오버라이딩 예시 (동물 울음소리)
class Animal { public void speak() { System.out.println("동물 울음소리") } } class Dog extends Animal { public void speak() { System.out.println("멍멍!"); } } class Cat extends Animal { public void speak() { System.out.println("야옹~"); } } class Main { public static void main(String args[]) { Dog dog = new Dog(); Cat cat = enw Cat(); dog.speak(); cat.speak(); } }
결과값:
멍멍!
야옹~
3. 하이딩
= static 메서드 관련
- 상위 클래스의 static 메서드를 하위 클래서에서 같은 유형으로 다시 선언
- 하이딩된 메서드는 메서드 호출이 클래스 타입에 따라 결정
ex) Parent a = new Child(); 일 때 instance a의 타입이 Parent이므로 Parent의 메서드 호출
무슨 말인지 어려우시면 아래 코드 보시면 알게 됩니다
하이딩 예시
class A { public void f() { System.out.print("1 "); } public static void g() { System.out.print("2 "); } } class B extends A { public void f() { System.out.print("3 "); } public static void g() { System.out.print("4 "); } } class C extends B { public void f() { System.out.print("5 "); } public static void g() { System.out.print("6 "); } } class D { public static void main(String args[]) { A obj = new C(); obj.f(); obj.g(); System.out.println(); B obj1 = new C(); obj1.f(); obj1.g(); } }
출력값:
5 2
5 4
main에서 두 개의 인스턴스 obj, obj1생성
A obj = new C();
B obj1 = new C();
상속관계 A -> B -> C
각 클래스는 두 개의 메서드 가지는데 메서드 이름이 같고, 매개변수 동일하기 때문에 메서드 오버라이딩 형태로 보여짐
메서드 f() 은 일반 메서드인데, g() 는 static 메서드
f() 의 경우 오버라이딩에 따라 상속받은 하위 클래스의 메서드를 수행
obj.f()는 최종 상속받은 하위클래스 C에 있는 f() 수행
obj1.f()도 C를 참조하므로 C에 있는 f() 수행
g() 는 인스턴스의 클래스 타입에 따라 결정됨 <
obj.g() => obj는 A타입 변수이므로 A가 가진 g() 호출
obj1.g() => obj1은 B타입 변수이므로 B가 가진 g() 호출
예제 - 하이딩 안 되는 경우
상위 클래스와 하위 클래스 모두 같은 static 메서드여야 하이딩이 됨
class A { public void f() { System.out.print("1 "); } public static void g() { System.out.print("2 "); } } class B extends A { public void f() { System.out.print("3 "); } public void g() { System.out.print("4 "); } } class D { public static void main(String aprgs[]) { A obj = new B(); obj.f(); obj.g(); // 여기서 오류 } }
위 코드는 오류발생
왜? g()메서드의 경우 상위 클래스 A는 static메서드로 선언되었으나 A를 상속 받은 하위클래스 B에서는 일반 클래스로 생성되어 있기 때문에 오류가 발생
'ETC > 정보처리기사' 카테고리의 다른 글
[정보처리기사] 서브넷 마스크 오답정리 (3) | 2025.03.26 |
---|---|
[정보처리기사] 디스크 스케줄링(FCFS, SSTF, SCAN, CSAN, LOOK, C-LOOK) & RAID (1) | 2025.03.16 |
[Java] 정보처리기사 자바의 상속 & 생성자 (3) | 2024.10.23 |
[Java] 자바의 예외처리 키워드, 예시, 종류 정리 (1) | 2024.10.18 |
[Java] 정보처리기사 추상클래스 / 인터페이스 정리 (오류 발생 문제 풀이) (3) | 2024.10.18 |