개발자 미니민의 개발스터디

[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 메소드는 들어오는 학점/이름 값이 다른 학점/이름 값 필드 값들과 동일한지 확인하는 메소드로 재정의했다. 

 

 

 

 

블로그의 정보

개발자 미니민의 개발로그

mini_min

활동하기