상속 ch7

IT/JAVA / / 2021. 6. 6. 13:45

1.상속

상속은 기존의 클래스를 재사용해서 새로운 클래스를 작성하는 것

부모 클래스에 있는 멤버를 모두 물려받기 떄문에 자손 클래스에서 몇가지만 더 추가해주면 된다.

http://tcpschool.com/java/java_inheritance_concept

그렇기 때문에 공통적으로 자주 쓰이는 멤버들을 가진 부모 클래스는 여러 자식 (child1, 2 ) 에서 상속 하여 가져올 수 있다.

 

또한 클래스간의 포함관계로도 나타낼 수 있는데

class Circle 
{
	int x;
	int y;
	int r;
}

class Point
{
	int x;
	int y;
}

class Circle
{
	Point c = new Point;
	int r ;
}
//이런식으로 포함관계를 만들어줄 수 있다.

상속관계 를 판단하려면 ~은 ~이다

포함관계를 판단하려면 ~는 ~을 가지고 있다

두가지 방법을 통해서 판단을 해보자.

 

2. 오버라이딩

오버 라이딩은 상속받은 메서드의 내용을 변경하는 것을 오버라이딩이라고 한다. 상속받은 메서드를 바꾸어 사용해야할 경우가 있기 때문이다.

오버로딩과 다른점은 오버로딩은 기존에 없는 새로운 메서드를 정의하는 것으로 보면 되고

오버라이딩은 기존에 있는 메서드의 내용을 변경하는 것이다.

 

class Circle 
{
	int x;
	int y;
	int r;

	String getLocation()
	{
		return x, y ;
	}
	void getNumber() {}
}

class Point extends Circle
{
	int z;
		
	void getNumber(int x) {} //오버로딩

	String getLocation() // 오버라이딩
	{
		return x, y, z;
	}
}

 

- 오버라이딩의 조건은 다음과 같다

   1.이름이 같아야 한다

   2.매개변수가 같아야 한다

   3.반환타입이 같아야 한다.

 

- super 사용

super 는 this 와 같게 동작하는데 조상 클래스 멤버와 자손클래스 멤버가 중복 정의되어 서로 구별해야 할때 나누어 쓴다.

class Parent 
{
	int x = 10;

	String getLocation()
	{
		return x, y ;
	}
}
	
}

class Child extends Parent
{
	int z;

	String getLocation()
	{
		return super.getLocation + z; //오버라이딩 및 super사용
	}
}

 

 

3. 제어자

제어자는 클래스 변수 또는 메서드의 선언부와 함께 쓰이고 제어자를 통해서 통제가 가능하다.

 

3.1) static 멤버변수와 메서드, 초기화 블럭에 사용할 수 있다

class StaticTest
{
	static int width;
	static int height;
	
	static 
	{
		width = 10; // width 실행전 초기화
	}

3.2) final 은 클래스 메서드 멤버변수, 그리고 지역변수에 쓰일 수 있다.

변수에 사용되면 값을 변경할 수 없는 상수가 되고, 메서드에 사용하면 오버라이딩을 할 수 없고, 클래스에 사용하면 자손클래스를 정의하지 못하게 된다.

→ 생성자를 통해서 final 멤버변수 초기화 방법

class Car
{
	final int CarNumber;
	final String CarOwner;
	
	Car(int carnumber, String owner)
	{
		CarNumber = carnumber; // 매개변수로 한번만 초기화 가능
		CarOwner = owner;
	}
}

3.3) abstract은 클래스와 메서드에서만 사용이 가능하다

abstract class Abstractclass {}

abstract void move() {}

 

abstract 는 미완성 설계도 이므로 인스턴스는 생성할 수 없다.

하지만 이 클래스를 상속받아서 일부의 원하는 메서드만 오버라이딩할 수 있다.

 

3.4) 접근 제어자

접근 제어자는 4가지로 나뉘는데

접근범위가 넓은곳에서 낮은곳의 순서로는

public > protected > (default) > private 이다

http://tcpschool.com/java/java_modifier_accessModifier

접근자를 쓰는 이유는 클래스 내부에 선언된 데이터를 보호하기 위해서이다. 데이터의 값을 변경하지 못하도록 해야할 경우나, 또는 어떤 데이터는 아무나 접근할 수 있게 만들 수 있게 하기 위해서다.

 

4. 다형성

다형성이란 프로그램 언어 각 요소들(상수, 변수, 식, 객체, 메소드 등)이

다양한 자료형(type)에 속하는 것이 허가되는 성질을 가리킨다.

- 위키피디아 중 -

 

즉 상황에 맞게 의미를 다르게 부여할 수 있는 특성이다.

참조변수의 다형성을 보여주는 예제

 

class Parent { ... }

class Child extends Parent { ... }

...

Parent pa = new Parent(); // 허용
Child ch = new Child();   // 허용
Parent pc = new Child();  // 허용
Child cp = new Parent();  // 오류 발생.

위에 예제를 보는것 처럼 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있다.

하지만 자손클래스 참조변수는 조상클래스의 참조변수를 모두 참조할 수 있지만. 조상클래스 참조변수는 자손클래스의 모든 멤버를 사용할 수 없다.

 

참조변수가 가르키고 있는 인스턴스의 타입을 찾으려면

instance of 을 사용한다 <확인할변수> instance of <class> 이런식으로 사용한다 .

class Parent { }
class Child extends Parent { }
class Brother extends Parent { }

public class Polymorphism01 {

    public static void main(String[] args) {

        Parent p = new Parent();
        System.out.println(p instanceof Object); // true
        System.out.println(p instanceof Parent); // true
        System.out.println(p instanceof Child);  // false
        System.out.println();

        Parent c = new Child();
        System.out.println(c instanceof Object); // true
        System.out.println(c instanceof Parent); // true
        System.out.println(c instanceof Child);  // true

    }
}

위의 예제를 확인하면 p, 와 c 의 참조변수가 어떤 인스턴스를 참조했는지 알 수 있기때문에 인스턴스 확인시 유용하게 쓰인다.

 

* 참조변수와 인스턴스의 연결 시 주의할점

멤버변수가 조상클래스와 자손 클래스에 중복으로 정의된 경우, 조상타입의 참조변수를 사용했을때는 조상클래스에 선언된 멤버변수가 사용되고, 자손타입의 참조변수를 사용했을 때는 자손클래스에 선언된 멤버변수가 사용된다.

class Parent 
{
	int x = 100;
}

class Child extends Parent
{
	int x = 200;
}

public void Main(string[] args)
{
	Parent A = new Child(); // A는 100
	Child B = new Child(); // B는 200
}

이런식으로 같은 멤버변수가 있더라도 참조되는 클래스가 다르기 때문에 다른 값이 나온다.

 

* 매개변수의 다형성

class Product 
{
	int price;
	int bonusPoint;
	
	Product(int price)
	{
		this.price = price;
		bonusPoint = (int) (price/10.0);
	}
}

class Tv extends Product
{	
	Tv() 
	{
		Product(int price)
		{
			super(100);
		}
	}
}

class Computer extends Product
{
	Computer() 
	{
		Product(int price)
		{
			super(200);
		}
	}
}

class Buyer 
{
	int money = 1000;
	int bonusPoint = 0;
	
	void buy (Product a)
	{
		
		money -= p.price;
		bonusPoint += p.bonusPoint;
	}

static void Main(string[] args)
{
	Buyer a = new Buyer;
	
	Tv b = new Tv();
	Computer c = new Computer();

	a.buy(b);
	a.buy(c);
	// 남은돈은 700 이 표시됨
	// bonuspoint 는 30
}

 

728x90
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기