[JAVA] chapter 7 객체지향 프로그래밍 || - 1

WOOK JONG KIM·2022년 9월 17일

자바의 정석

목록 보기
7/25
post-thumbnail

상속

클래스 재사용 방법 중 하나

조상 클래스 변경 -> 자손 영향
자손 클래스 변경 -> 조상 클래스 영향 X

자손 클래스는 조상 클래스의 모든 멤버를 상속 받는다

포함 관계

클래스 재사용 방법 중 하나

한 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언

class Circle
{
	int x;
    int y;
    int r; // 원 반지름
}
class Point
{
	int x;
    int y;
}
Class circle
{
	// 포함 관계 구현
	Point c = new Point();
    int r;
}

관계 결정

is-a : 상속
has-a : 포함

위의 원을 예시로 들면 포함 관계가 바람직

SportsCar와 Car의 경우 상속이 바람직

Object 클래스

모든 클래스의 상속계층도의 최상위에 있는 조상클래스

상속을 받지 않는 클래스라 해도 컴파일 시 자동으로
extends Object가 추가됨

-> 즉 자바의 모든 클래스는 Object 클래스의 정의된 멤버 사용 가능

오버로딩 vs 오버라이딩

오버로딩: 기존의 없는 새로운 메서드를 정의하는 것(new)

오버라이딩 : 상속받은 메서드의 내용을 변경하는 것(change)

오버 라이딩 조건

  1. 선언부가 조상클래스의 메서드와 일치해야 한다.
  2. 접근 제어자를 조상 클래스의 메서드 보다 좁은 범위로 변경 X
  3. 예외는 조상 클래스의 메서드 보다 많이 선언 X

참조변수 super

자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용하는 참조 변수

public class Ex7_2 {

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

}

class Parent{ int x = 10; /* super.Ex7_2 */}

class Child extends Parent
{
	int x = 20; // this.x
	
	void method()
	{
		System.out.println("x=" + x);
		System.out.println("this.x=" + this.x); // 10
		System.out.println("super.x ="+ super.x); // 20
	}
}

super() - 조상 생성자

class Point
{
	int x, y;
    
    Point(int x, int y)
    {
    	this.x = x;
        this.y = y;
    }
}
class Point3D extends Point
{
	int z;
    
    Point3D(int x, int y, int z)
    {
    	/* this.x = x;
        this.y = y; 틀린건 아님 */ // 
        super(x,y);
        this.z = z;
    }
}

클래스 자신에 선언된 변수자신의 생성자가 초기화를 책임지도록 작성하는 것이 좋다

패키지(package)

클래스의 묶음

ex) java.lang.String -> java의 서브디렉토리인 lang에 속한 String.class 파일

package 클래스명;
// 주석과 공백을 제외한 첫 번째 문장이여야 한다.

모든 클래스는 반드시 하나의 패키지에 포함 되어야 함!

선언 안할시 자바에서 제공하는 unnamed package에 속함

package com.codechobo.book;

class PackageTest
{
	public static void main(String[] args)
    {
    System.out.println("Hello World!");
    }
}

/* 이후 com의 상위 디렉토리인 c:\jdk1.8\work 디렉토리를 클래스 패스에 포함 시켜야만

JVM이 PackageTest를 찾을 수 있다.

이후 jar 파일을 클래스 패스에 추가해 주어야 한다! */

static import문

static 멤버를 호출할때 클래스의 이름을 생략 할 수 있다.

예시

import static java.lang.System.out;
import static java.lang.Math.*;

class EX7_6
{
	public static void main(String[] args)
    {
    out.println(random());
    
    out.println("Math.PI:" + PI);
   	}
}

접근 제어자

사용 이유: 클래스 내부에 선언된 데이터 보호 및 외부 접근 차단

캡슐화(데이터 감추기)

멤버변수에 접근하여 값을 바꾸는 것을 제어하기 위하여(private) 사용

public class Time
{
	private int hour;
    private int minute;
    private int second;
    
    public int getHour() { return hour;}
    public void setHour(int hour)
    {
    	if(hour < 0 || hour > 23) return;
        this.hour = hour;
    }
}


// getter, setter 이용

다형성(polymorphism)

여러 가지 형태를 가질 수 있는 능력

한 타입의 참조변수여러 타입의 객체참조할 수 있도록 하는 것

-> 조상 클래스 타입의 참조변수로 자손클래스의 인스턴스 참조

class TV
{
	boolean power;
    int channel;
    
    void power() { power ~= power;}
    void channelUp() { ++ channel;}
    void channelDown() { -- channel;}
}


class SmartTv extends Tv
{
	String text;
    void caption(){}
}
SmartTv s = new SmartTv(); // 참조 변수와 인스턴스 타입이 일치
TV t = new SmartTV(); // 조상 타입 참조변수로 자손 타입 인스턴스 참조

참조변수 형변환

서로 상속 관계에 있는 경우에만 가능

class Car{}
class FireEngine extends Car{}
class Ambulance extends Car{}

// Car 클래스에 두개의 자손 클래스가 있는 형태
FireEngine f = new FireEngine();
Car c = (Car)f; // (Car) 생략가능, 사용 가능한 멤버 개수가 더 적어지기에 안전

FireEngine f2 = (FireEngine)c; // (FireEngine) 생략 불가능
Ambulance a = (Abulance)f; // 상속 관계가 아니라 error 발생
package java_exercise;

public class Ex7_7 
{

	public static void main(String[] args) {
		Car car = null;
		FireEngine fe = new FireEngine();
		FireEngine fe2 = null;
		
		fe.water();
		car = fe;
		// car.water() -> car 타입으로 water() 호출 불가!
		fe2 = (FireEngine)car;
		fe2.water();

	}
	
}
class Car
{
	String color;
	int door;
	
	void drive() 
	{
		System.out.println("drive, Brrr~");
	}
	
	void stop()
	{
		System.out.println("Stop!!");
	}
}
class FireEngine extends Car
{
	void water()
	{
		System.out.println("water!!");
	}
}


instance of 연산자

형 변환이 가능한지 확인하는 연산자

참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 사용

왼쪽 : 참조변수

오른쪽 : 타입(클래스명)

void doWork(Car c)
{
	// FireEngine으로 형 변환이 가능한지 확인 하는것!!
	if(c instanceof FireEngine)
    {
    	FireEngine fe = (FireEngine)c;
        fe.water();
    }
    
}

여기서 Car타입 참조변수c는 Car클래스 혹은 자손 클래스의 인스턴스를 넘겨 받음

하지만 메서드내에서는 어떤 인스턴스 인지를 알 수 없다.
profile
Journey for Backend Developer

0개의 댓글