컴퓨터프로그래밍/JAVA

자바의 상속

zelkova 2016. 4. 20. 23:59


 <목차로 돌아가기>


  상속(확장)의 개념


이미 만들어진 어떤 클래스를 사용하는 방법은 크게 2가지가 있다. 

첫번째는 앞에서 배운 클래스 틀을 이용하여 인스턴트를 만들어 바로 사용하는방법

두번째는 extends를 사용하여 상속(확장)받아 사용하는 방법이다.


객체지향을 통해서 달성하는 목표는 재활용성이다.

이 빌어XX 상속은 재활용성을 극대화한 대신에 객체지향을 복잡하게 만드는 녀석이다.



객체지향의 개념을 코드를 통해서 알아보자.


아래가 엄청나게 복잡한 코드라고 가정하고 생각하자.


class computer{

public void setAppend{char a);

String+=a;

}

public void Sum(int a, int b)

System.out.println(a+b);

}

}


아래와 같은 경우에는 객체에 메소드를 추가하는 것이 어렵다.

1. 객체를 자신이 만들지 않고 퍼와서 소스를 변경하기 힘들다.

2. 소스를 업데이트하면 메소드 sum()이 사라진다. 

3. 객체가 다양한 고셍서 활용되고 있는데 메소드를 추가하면 다른곳에 불필요한 기능이 추가된다.


이런 경우에 상속을 사용하여 어떤 객체의 변수(필드)와 메소드를 다른 객체가 물려받아 사용할 수 있다.


용어정리

물려주는클래스 상위(Super)클래스 또는 기초 클래스(base clase)

물려받는클래스 하위(Sub)클래스 또는 유도 클래스(derived class)



특징

확장은 반드시 한 개의 클래스에서 출발해야 한다.

여러 클래스에서 동시에 확장하는 것은 불가능하다.





  소스를 통한 이해


substract class에서 메소드를 지정하지 않아도 main 실행함수에서 substract 클래스가 setAppend와 Sum 메소드를 사용할 수 있다.

이것이 가능한 이유는 extend computer 때문이다.

이것은 setAppend를 상속받는다는의미이다.




class computer{

public void setAppend{char a);

String+=a;

}

public void Sum(int a, int b)

System.out.println(a+b);

}

}


class substract extends computer{

public void sub(int a, int b){

System.out.println(a-b);

}

}


public class Main{

public static void main(String[] args){

substract s = new substract();

s.setAppend('k');

s.sum(5,6);

s.sub(10,7);

}

}


상속의 장점

1. 코드의 중복을 제거할 수 있다.

2. 부모 클래스의 코드를 수정하면 상속받고 있는 자식 클래스에게 자동으로 혜택이 돌아감



  상속과 생성자


 상속받을 때 부모 클래스에서 매개변수를 가지고 있는 생성자가 있다면 에러가난다.


해결방법.

1. 명시적으로 선언한다.

class computer{

public computer(){

}

public computer(char a){

}


public void Sum(int a, int b)

System.out.println(a+b);

}

}


class substract extends computer{

public void sub(int a, int b){

System.out.println(a-b);

}

}


public class Main{

public static void main(String[] args){

substract s = new substract();

s.setAppend('k');

s.sum(5,6);

s.sub(10,7);

}

}



2. super을 사용한다.

class computer{


public computer(char a){

}


public void Sum(int a, int b)

System.out.println(a+b);

}

}


class substract extends computer{

public substract(char a){

super(a);

}

public void sub(int a, int b){

System.out.println(a-b);

}

}


public class Main{

public static void main(String[] args){

substract s = new substract();

s.setAppend('k');

s.sum(5,6);

s.sub(10,7);

}

}




반응형