티스토리 뷰

오버로딩(Overloding)

같은 이름의 메소드 또는 생성자로 입력 받은 매개변수타입과 갯수에 따라 다른 액션을 취하도록 하는 것이다.

 

OverLoding(int n){
		System.out.println("int "+n);
	}
	OverLoding(String s){
		System.out.println("String "+s);
	}

 

오버로딩(OverLoding)생성자다.

이름은도 같고 입력 받는 매개변수의 개수 또한 같다.

하지만 매개변수의 타입(int, String)이 다르기 때문에 오버로딩이 가능하다.

 

		OverLoding overloding2 = new OverLoding(2);
		OverLoding overloding3 = new OverLoding("Pigg");

 

생성자이므로 객체를 생성할 때 내용이 실행되는데

int 타입인 숫자(2)를 받았을 때는

 

OverLoding(int n){
		System.out.println("int "+n);
	}

 

이 실행되어 int 2 가 출력되고

String 타입의 문자열("Pigg")를 받았을 때는

 

OverLoding(String s){
		System.out.println("String "+s);
	}

 

이 실행되어 String Pigg 가 출력된다.

타입이 같더라도 개수가 다를 경우 오버로딩이 적용된다.

 

OverLoding(int n){
		System.out.println("int "+n);
	}
	OverLoding(int n, int n2){
		System.out.println("int "+n+" int2 "+n2);
	}

 

매개변수로 똑같은 int 타입이지만 개수가 다르기 때문에 오버로딩이다.

 

		OverLoding overloding2 = new OverLoding(2);
		OverLoding overloding4 = new OverLoding(2,2);

 

overloding4 는 int 타입의 매개변수를 2개 받았기 때문에

int 2 int2 2 가 출력된다.

 

생성자 뿐만 아니라 메소드 또한 마찬가지다.

 

 

오버라이딩(Overriding)

 

부모클래스로부터 메소드를 상속 받았으나,

그 메소드(매개변수, 리턴 타입이 완전히 같은)를

자식클래스에서 재정의 하여 사용하는 것(상속 받은 메소드 무시)이다.

도대체 이게 무슨 말이냐...?

일단 오버라이딩을 이해하기 위해서는 상속(Inheritance)을 반드시 알아야 한다.


상속을 간단히 설명하자면,

상속을 해 주는(부모 클래스)상속을 받는(자식(자손) 클래스)로 나눌 수 있다.

자식 클래스는 부모 클래스로부터 필드메소드를 상속 받는다.

상속 받은 필드와 메소드는 자식 클래스에 정의되어 있지 않더라도 사용할 수 있다!

기본적으로 모든 필드와 메소드를 상속 받을 수 있지만

접근 제어자영향을 받으며 그에 따라 범위가 달라진다.

접근제어자의 접근 범위

 


이제 상속을 이해했으니 다시 본론으로 들어가서

 

class Dog {
	void sound(){
		System.out.println("멍멍");
	}
}
class Poodle extends Dog {
	@Override//오버라이드 했다는 표시로 없어도 실행에 변화는 없다.
	void sound(){
		System.out.println("왈왈");
	}
}
class Chihuahua extends Dog {
	@Override
	void sound(){
		System.out.println("뭉뭉");
	}
}
class BigDog extends Dog {

}

 

Dog 는 소리를 낼 수 있다. ("멍멍")

Poodle, Chihuahua, BigDog

이 3개의 클래스는 Dog 로부터 상속을 받아 소리(sound())를 낼 수 있을것이다.

("멍멍")

하지만 자세히 보면 Poodle, Chihuahua 에는 상속 받은 소리(sound())와 똑같은 이름의 메소드(Sound())가 구현되어 있다.

부모에게도 상속 받고 자식에게도 완전히 같은 메소드가 있다...?

실행을 해보자

 

class AnimalTest01{
	public static void main(String args[]){
		Dog dog = new Dog();
		Poodle poodle = new Poodle();
		Chihuahua chihuahua = new Chihuahua();
		BigDog bigDog = new BigDog();
		
		dog.sound();
		poodle.sound();
		chihuahua.sound();
		bigDog.sound();
	}
}

 

dog, poodle, chihuahua, bigDog

모두에게 소리(sound)를 내보라 했다.

<실행 결과>

 

dog 의 소리sound() 는 그대로 "멍멍" 이다.

sound() ㅡ> 멍멍

poodle부모(dog)의 소리내는 sound()의 기능상속 받았지만

sound()를 poodle 클래스 자체에서 재정의 했기 때문에

부모클래스의 sound()("멍멍") 를 무시하고

재정의 한 클래스 sound()("왈왈") 를 실행한다.

sound() ㅡ> 왈왈

chihuahua 또한 부모(dog)의 소리내는 sound()의 기능상속 받았지만

sound()를 chihuahua 클래스 자체에서 재정의 했기 때문에

부모클래스의 sound()("멍멍") 를 무시하고

재정의 한 클래스 sound()("뭉뭉") 를 실행한다.

sound() ㅡ> 뭉뭉

bigDog 는 부모(dog)의 소리내는 sound()의 기능상속 받았으므로 "멍멍" 이다.

sound() ㅡ> 멍멍

 

'Programing > JAVA' 카테고리의 다른 글

[JAVA] 자바 배열 선언  (0) 2020.07.30
[JAVA] 자바 this, super  (0) 2020.07.29
JAVA 자바 - 데이터 타입  (0) 2020.07.28
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함