[JAVA] 자바 - 메소드 오버라이딩(Method Overriding) ⭐⭐
by mini_min[JAVA]
자바 - 메소드 오버라이딩
Method Overriding
✔️ 메소드 오버라이딩?
상위클래스를 상속 받은 하위클래스에서 상위클래스에 정의된 메소드를 재정의 하는 것이다.
상위클래스의 메소드 기능을 유지 + 상황에 따라 변형된 기능을 사용할 경우 사용!!
⭐ 다형성 구현의 핵심 원리!
❌ 오버라이딩된 상위 클래스의 메소드는 숨겨진다!
숨겨진 상위클래스의 메소드는 호출될 수 없다...bye..
🏷️ 특징
- (필수) 메소드 이름, 리턴 타입, 파라미터 수, 타입 완전히 일치
- (필수) 반드시 상속 관계에 있을 것
- 재정의된 하위 클래스의 접근 제한자는 상위 클래스의 접근 제한자보다 크거나 같아야한다!
- static, final, private 메소드는 오버라이딩 할 수 없다.
- 기존 메소드가 가진 예외사항은 제거할 수 있어도 새로운 예외사항 추가는 어렵다.
💡 하위 클래스 접근 제한자 >= 상위 클래스 접근 제한자
✔️ 메소드 오버라이딩 예시
class Demo1 { //상위클래스
int a =10;
int b =100;
public void disp() {
System.out.println("a:" +a);
}
public void print() {
System.out.println("print...");
}
}
class Test1 extends Demo1{
int x = 100;
int b = 50;
//override : 상속관계에 있어야함. 메소드의 시그니처가 동일해야함
@Override
public void disp() {
System.out.println(a+","+x);
}
public void write() {
disp(); //test1 의 disp()호출 (본인의 disp()를 호출한다.)
super.disp(); //상위 클래스의 disp 호출
print();//상위 클래스의 print() 호출!
}
}
💡 하위클래스가 disp() 메소드를 오버라이드했다! 하위클래스의 disp() 오버라이드로 인해 상위클래스에서는 disp() 메소드를 더이상 사용하지 못하게 되었다. (숨어버림) 하위클래스가 오버라이드 하지 않은 메소드는 상위클래스 메소드로 호출 가능하다.
✔️ @Override 어노테이션
'@'는 소스 코드에 메타 데이터를 표현한 것으로 컴파일 또는 실행과정에서 코드를 어떻게 컴파일하거나 처리할 것인지 알려주는 정보다! 컴파일 할때 코드 문법 에러를 체크하도록 정보를 제공한다.
쉽게 말해서 @Override는 메소드가 오버라이드 되었는지 검증해준다!!
public String toString() {
if(name == null) //아버지의 toStirng 버리고 내가 새로 씀!!!
return null;
return name + "," + age;
✔️ toString 오버라이드 하기
해쉬코드값을 출력하는 toString메소드를 오버라이드로 재정의해서 다르게 사용해보려고한다.
class Test3 {
private String name;
private int age;
public Test3() {
}
public Test3(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//Test3 의 상위클래스 = Object
public String toString(){
if(name == null)
return null;
return name + "," + age;
}
💡 Test3 의 상위클래스는 Object 클래스이다.
toString() 을 오버라이드 하기위해서 클래스명, 변수 갯수, 리턴 타입을 제대로 써주고 @Override 어노테이션 도 야무지게 붙여준다. 변경할 기능을 아래 작성해주면 끝!
❌ toStirng 을 오버라이드했기 때문에, 상위클래스에서 쓰이던 toString 기능은 숨어버렸다.
✔️ equals 오버라이드 하기
이번에는 equals 오버라이드다.
equals 는 주소값을 비교하는데, 이번에는 '필드 값들의 일치 여부'를 비교하도록 재정의해본다.
class Test4 {
private String hak;
private String name;
public String getHak() {
return hak;
}
public void setHak(String hak) {
this.hak = hak;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
💡 먼저, Test4 클래스의 게터세터 메서드를 만들어준다. 이때, Test4의 상위클래스는 Object 클래스다.
이후 equals 메소드를 오버라이드해본다.
@Override
public boolean equals(Object obj){
Test4 t = (Test4)obj;
return hak.equals(t.getHak()) && name.equals(t.getName());
}
Test4 tt = new Test4();
tt.setHak("1111");
tt.setName("나자바");
Test4 tt3 = new Test4();
tt3.setHak("1111");
tt3.setName("나자바");
System.out.println(tt.equals(tt3)); // 필드들의 비교 true
💡 오버라이드로 equals 메소드는 들어오는 학점/이름 값이 다른 학점/이름 값 필드 값들과 동일한지 확인하는 메소드로 재정의했다.
'Java' 카테고리의 다른 글
[JAVA] 자바 - 추상화 클래스(abstract 클래스) (0) | 2022.07.26 |
---|---|
[JAVA] 자바 - 참조형 변수의 다형성, 업 캐스팅(up-casting) (0) | 2022.07.25 |
[JAVA] 자바 - 상속과 생성자 (super, this) (0) | 2022.07.25 |
[JAVA] 자바 - 상속 관계 정의 (super/sub 클래스) (0) | 2022.07.25 |
[JAVA] 자바 - Math 및 Random 클래스 (0) | 2022.07.25 |
블로그의 정보
개발자 미니민의 개발로그
mini_min