본문 바로가기
IT/자바

상속과 Override 메소드 재정의

by 독서실총무J 2017. 5. 6.
반응형

안녕하신가?

황금연휴의 주말이다

곧 길고긴 연휴가 끝이 난다는 얘기다

그동안 일걱정 없이 또는 학업걱정 없이

지내왔던 그날들이 끝난다는 말이다


슬프겠다

내가 부러운가?

사실 난 당신이 더 부럽다

내 올해 소망은 백수생활을 청산하는 것이다

그렇게 하기 위해서는 지금 쓰고 있는

복습 포스팅을 좀더 신경써서 해야겠지?

오늘도 한번 열심히 해보자


이번에 다뤄볼 주제는 상속이다

매우매우 중요하다고 볼수 있다

배우던 과정속에서도 꽤 중요히

다루었던 상속이므로 정신 번쩍 차리고

복습을 하려고 한다


코드를 보여주기 앞서서

간단히 설명을 하고 넘어가자


항상 구글에게 물어보라며

그냥 넘어가던 설명을 한다고 하니

어색하게 느끼실수도 있겠지만

요번 포스팅에서는 꼭 하고 넘어가야 하겠다


자바에서 상속이란 우리 일상에

쓰이는 의미와 똑같다

부모님께 유산을 상속 받았다라는 말

많이 들어보았을 것이다


정말 부럽다

난 빚이나 안물려 받으면 다행인 상황이다 

받을게 있다니 정말 부럽다

당신도 나같은 경우라면 잠시 부러워 하는 

시간을 갖도록 하자 


다 부러워 했는가?

그럼 다시 본론으로 들어가서

자바에서도 하위 클래스가 상위로부터

물려받을수가 있다 


필드나 메소드가 그것인데

명심해야 할것은

상위 하위 클래스간의 관계이다


아무때나 상속을 하는건 옳지 않다

is-a 관계를 만족 할때만 가능하다

쉽게 예를 들자면 '사람은 동물이다'는

가능하나 '사람은 태권v'다는 불가능하다


또한 상위와 하위 관계도 잘 생각해야 한다

상위클래스가 관리자이고

하위가 직원이라면 언뜻 보기에는

is-a 관계가 성립되는것 같지만 그렇지 않다

둘의 위치가 바뀌어야 맞을것이다

관리자는 직원의 직책중 하나니까


기본적인 설명은 여기까지만 하고 

예제를 통해서 좀더 정확히 알아보자


class Parent {	
	public Parent(int n) {
		System.out.println("Parent");
	}
	public Parent(String str, int n) {
		
	}
}
class Child extends Parent {
	public Child() {
		super("abc", 3);
		System.out.println("Child");
	}
}

class UseChild {
	public static void main(String[] args) {
		Child c = new Child();		
	}
}


상속을 사용할때는 extends와 상위클래스를 써주면된다

위에서는 Parent가 상위 즉 부모가 될것이고

Child가 하위, 자식이 될것이다


this를 복습하면서 언급했던 super가 나왔다

this가 자기자신이라면 super는 부모를 나타낸다

여기서는 어떤 의미를 지니겠는가?

str,n으로 구성된 Parent 생성자를 참조하고 있다


결과적으로 실행을 해보면

Child라고 짧게 찍혀 나올것이다 


추가적으로 상속에 대한 설명을 덧붙이자면

자식 = 부모 + @라고 볼수 있다

절대 자식 = 부모가 되어서는 안될것이다

그건 두 객체가 똑같다는 말이 될테니까 의미가 없다


class Unit { private int hp; public Unit(int hp) { this.hp = hp; } public int getHp() { return hp; } } class Zealot extends Unit { private int power; public Zealot(int hp, int power) { super(hp); this.power = power; } public int getPower() { return power; } } class UseZealot { public static void main(String[] args) { Zealot z = new Zealot(100, 10); System.out.println(z.getPower()); System.out.println(z.getHp()); } }


스타크래프트 해본적 있는가?

이번 예제는 질럿을 이용하였다

먼저 상속 관계가 성립되는지 살펴보자

질럿은 유닛이다

맞다 관계 형성이 제대로 되었으므로

아무 문제가 없을것이다


그럼 여기서 +@ 는 무엇일까?

Power에 대한 정보가 질럿에 들어있다


스타를 해본 사람들은 알것이다

질럿은 프로토스라는 종족인데

만약 내가 유닛과 종족이라는 클래스로부터

상속을 받고 싶다면 이게 가능할까?


결론부터 말하자면 자바에서는 불가능하다

다중상속을 허용하지 않는다

다른언어는 잘 모르겠다 

한번 구글에서 찾아보길 바란다

알아보고 나한테도 좀 알려주길 또 바란다


// 밥먹는다.
class GrandFather {
	void eat() {
		System.out.println("GrandFather");
	}
}
class Father extends GrandFather{
	private int age = 60;
	public void setAge(int age) {
		this.age = age;
	}
	public int getAge() {
		return age;
	}
	void eat() {		
		System.out.println("오른손으로 밥먹어요~");
		super.eat();
	}
}
class Son extends Father {
	// int age = 20;
	/*
	 Override 
	 - 부모클래스의 기능을 자식클래스가 재정의 
	 - 기능의 What(존재목적)은 유지, How(구현)가 변경되는 경우
	 - 부모클래스의 메서드와 동일 : 이름, 파라미터 정보, 리턴
	 - 부모클래스와 달라질 수 있는것 : 접근제한자(더 넓어지는것만 허용)
	*/	
	@Override
	protected void eat() {		
		System.out.println("왼손으로 밥먹어요~");
		super.eat();
	}
}
class UseSon {
	public static void main(String[] args) {
		Son s = new Son();
		s.setAge(20);
		System.out.println(s.getAge());
		s.eat();
	}
}


이번엔 Override에 대해서 생각해보자

한국말로 메소드 재정의 이다

말그대로이다 메소드를 재정의 하는것 !


자식 = 부모 + @이다

부모에 있는 메소드를 

자식에서는 바꿔 쓰고 싶을때 

재정의는 필수적일 것이다


Override의 조건은 소스 주석에 나와있으니

다시 한번 살펴보길 바란다

마지막 접근제한자는 더넓어지는 경우를 생각해야한다

Public > Protected > 생략 > private

순서로 좁아 진다고 알면된다


메소드를 적어주기 전에 

@Override라는 명령어를 적어주면

메소드 재정의가 가능한데,

이에 대한 규칙은 다음 

예제를 살펴보며 복습해보자


class SuperClass { public void todo(int n, int m, int k, double d, String str, int h, char c) { } } class SubClass extends SuperClass { @Override public void todo(int n, int m, int k, String str, double d, int h, char c) { // A } @Override public void todo(int n){ // B } @Override public void todo(int n, int m, int k, double d, String str, int h, char c) { // C } } class OverrideEx { public static void main(String[] args) { } }


재정의된 todo 메소드가 세개나 된다

이중 어떤것이 오류가 날까?

직접 쳐보고 확인 해보는것을 추천하며

답을 말하자면 가장 아래쪽 C만 가능하다


이게 어떤 의미가 있는지 예상해보자


메소드 재정의 할때에는

파라미터의 정보를 그대로 지켜주어야 한다

갯수는 물론이고 ,  써준 순서도 똑같이 해줘야 한다는것!


파라미터와 더불어 메소드 이름, 리턴 또한

지켜주어야 한다 


사용하기 까다로울것 같아 보이나 

오히려 익숙해지면 더 편하다



오늘도 복습을 한다고 수고한 나에게

박수를 치며 끝내고자 한다


어째 시간이 갈수록 써야될 정보가 많은것 같다

그덕에 문장을 재미있게 써볼 여유도 사라지는것 같고

글이 딱딱 해지는걸 느낀다


두마리 토끼를 다 잡으려면 더 힘을 내서 써야할것 같다

행복한 불토이다

모든 젊은이들이 불타는 토요일에 불장난을 열심히 해서

저출산 시대를 해결했으면 좋겠다 

내일 봅시다

반응형

댓글