
클래스 재사용 방법 중 하나
조상 클래스 변경 -> 자손 영향
자손 클래스 변경 -> 조상 클래스 영향 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의 경우 상속이 바람직
모든 클래스의 상속계층도의 최상위에 있는 조상클래스
상속을 받지 않는 클래스라 해도 컴파일 시 자동으로
extends Object가 추가됨
-> 즉 자바의 모든 클래스는 Object 클래스의 정의된 멤버 사용 가능
오버로딩: 기존의 없는 새로운 메서드를 정의하는 것(new)
오버라이딩 : 상속받은 메서드의 내용을 변경하는 것(change)
자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용하는 참조 변수
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
}
}
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;
}
}
클래스 자신에 선언된 변수는 자신의 생성자가 초기화를 책임지도록 작성하는 것이 좋다
클래스의 묶음
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 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 이용
여러 가지 형태를 가질 수 있는 능력
한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 하는 것
-> 조상 클래스 타입의 참조변수로 자손클래스의 인스턴스 참조
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!!");
}
}
형 변환이 가능한지 확인하는 연산자
참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 사용
왼쪽 : 참조변수
오른쪽 : 타입(클래스명)
void doWork(Car c)
{
// FireEngine으로 형 변환이 가능한지 확인 하는것!!
if(c instanceof FireEngine)
{
FireEngine fe = (FireEngine)c;
fe.water();
}
}
여기서 Car타입 참조변수c는 Car클래스 혹은 자손 클래스의 인스턴스를 넘겨 받음
하지만 메서드내에서는 어떤 인스턴스 인지를 알 수 없다.