기존 클래스를 확장하여 새로운 클래스를 작성하는 기법
상속 관계 : is - a 관계
포함 관계 : has - a 관계
부모클래스로부터 상속받은 메서드의 내용을 변경하는 것
오버 라이딩 : 부모 클래스에 존재하는 메서드를 자식 클래스에서 재정의 하는것
오버 로딩 : 같은 함수의 이름으로 매개변수를 달리하여 새롭게 만드는 것(new)
super
여러가지 형태를 가질 수 있는 성질
package Chapter7;
class Animal {
}
class Dog extends Animal {
} // Animal 상속
public class PolymorphismExample {
public static void main(String[] args) {
Animal dog = new Dog();
// 부모클래스 타입의 참조 변수 : Animal
// 자식클래스 인스턴스 참조
}
}
Animal
package Chapter7;
public abstract class Animal {
abstract void eatSomething();
}
Main
package Chapter7;
public class PolymorphismExample {
public class Cat extends Animal {
@Override
void eatSomething() {
System.out.println("고양이 사료 먹는중...");
}
}
public class Dog extends Animal {
@Override
void eatSomething() {
System.out.println("강아지 사료 먹는중...");
}
}
public class Pig extends Animal {
@Override
void eatSomething() {
System.out.println("돼지 사료 먹는 중..");
}
}
public void main(String[] args) {
Animal dog = new Dog();
Cat cat = new Cat();
Pig pig = new Pig();
//instanceof 키워드
System.out.println(cat instanceof Animal); // true
// 부모 클래스 매개변수
doEat(dog);
doEat(cat);
pig.eatSomething();
// 부모 클래스 배열
Animal animals[] = new Animal[3];
animals[0] = new Dog();
animals[1] = new Cat();
animals[2] = new Pig();
}
private static void doEat(Animal animal){
animal.eatSomething();;
}
}
물리적으로 관련이 있는 클래스 파일들을 포함하는 하나의 디렉토리
Java 컴파일러에게 소스 파일에 사용된 클래스의 패키지에대한 정보를 제공하는 것
package Chapter7;
import java.*;
import java.io.*;
import java.util.ArrayList;
import static java.lang.System.out;
public class PackageAndImportExample {
public static void main(String[] args) {
out.println("Hello world");
//System.out.println으로 사용안해도 된다.
}
}
변수, 메서드, 클래스 등에 대한 접근이나 어떤 기능적인 부분에 대해 지정해주는 것
접근 제어자
그 외의 제어자
static - 공통적인, 인스턴스가 아닌 클래스에 관련이 있음을 알리는 제어자
final - 마지막의, 변경할 수 없도록 하는 제어자
abstract - 추상의, 대상이 미완성임을 알리는 제어자
외부에서 클래스 내부의 변수에 대한 접근을 제어함

긴밀한 관계가 있는 클래스를 클래스 안에 선언하여 사용하는 방법
내부 클래스에서 외부클래스의 멤버들을 쉽게 접근 가능
코드의 복잡성을 줄임
내부 클래스의 종류는 변수 선언 위치와 동일(인스턴스,static,메서드 내부)
내부클래스 중에서 satic 클래스만 static 멤버를 가질 수 있음
final과 static이 동시에 붙은 변수는 상수, 모든 내부 클래스에 정의가능
인스턴스 클래스
외부 클래스의 인스턴스 멤버를 객체 생성 없이 접근 가능
static 클래스는 바로 접근 가능
static 클래스
외부 클래스의 인스턴스 멤버를 객체 생성 후 접근 가능
인스턴스 클래스의 멤버 변수는 객체 생성 후 접근 가능
Plants
package Chapter7;
public class Plants {
Sunflower sunflower = new Sunflower();
//static class
static class Rose {
final static String name = "Rose";
static void bloom(){
System.out.println("장미가 피었습니다.");
}
}
// instance class
class Sunflower{
final static String name = "Sunflower";
void bloom(){
System.out.println("해바라기가 피었습니다");
}
}
//local class
void makePlants(){
class NewFlower{
final static String name = "newFlower";
void bloom(){
System.out.println("새로운 꽃이 피었습니다");
}
}
NewFlower newFlower = new NewFlower();
newFlower.bloom();
}
}
main
package Chapter7;
public class InnerClassExample {
public static void main(String[] args) {
Plants.Rose.bloom();
Plants plants = new Plants();
plants.sunflower.bloom();
plants.makePlants();
}
}
이름이 없는 클래스로 추상 클래스 혹은 인터페이스를 바로 객체로 생성해서 반환
Automobile
package Chapter7;
abstract class Automobile {
abstract void move();
}
class Bus extends Automobile{
@Override
void move() {
System.out.println("버스는 정류장을 따라 달린다.");
}
}
class Taxi extends Automobile{
@Override
void move() {
System.out.println("손님을 태우고 목적지까지 달린다");
}
}
익명 클래스 사용
package Chapter7;
public class AnonymousClassExample {
public static void main(String[] args) {
Automobile bus = new Bus();
Automobile taxi = new Taxi();
Automobile automobile = new Automobile() {
@Override
void move() {
System.out.println("자동차는 달린다");
}
};
bus.move();
taxi.move();
automobile.move();
}
}
Class에 abstract 제어자가 붙은 미완성인 클래스
선언부만 존재하고, 구현부가 없는 메서드
하나의 추상 메서드를 가진 추상 클래스
package Chapter7;
public abstract class Animal {
abstract void eatSomething();
}
추상 클래스 상속후 추상 메서드 구현하기
package chapter7;
public class Dog extends Animal{
@Override
void eatSomething(){
System.out.println("강아지는 사료를 먹습니다");
}
}
추상 메서드, 디폴트 메서드, static 메서드, 상수만 가진 클래스
인터페이스는 static상수만 정의 가능
조상 클래스의 멤버변수와 충돌 가능성이 거의 없음
개발자 간에 기능을 제공하는 쪽과 사용하는 쪽이 존재
interface
package Chapter7;
public interface Vehicle {
void take();
void move();
}
interface 구현
package Chapter7;
public class Car implements Vehicle{
@Override
public void take() {
System.out.println("자동차 타기");
}
@Override
public void move() {
System.out.println("자동차 옮기기");
}
}
package Chapter7;
public class Airplane implements Vehicle{
@Override
public void take() {
System.out.println("비행기 타기");
}
@Override
public void move() {
System.out.println("비행기 이동하기");
}
}
인터페이스에 구현 가능한 메서드
default 메서드 추가
package Chapter7;
public interface Vehicle {
void take();
void move();
default void refuel(){
System.out.println("Need to refuel gasoline");
}
}
default 메서드 사용하기
package Chapter7;
public class DefaultMethodExample {
public static void main(String[] args) {
Vehicle car = new Car();
Airplane airplane = new Airplane();
car.move();
car.take();
car.refuel();
airplane.move();
airplane.take();
airplane.refuel();
}
}
공통점
차이점
Human class
package Chapter7;
public abstract class Human {
String name;
String id;
String gender;
String job;
Human(String name, String gender, String job){
this.name = name;
this.id = job + (int)(Math.random()*10000+1);
this.gender = gender;
this.job = job;
}
abstract public void showRole();
void updatgInfo(String changeName, String gender){
this.name = changeName;
this.gender = gender;
this.id = this.job + (int)(Math.random()*10000+1);
}
}
Police class
package Chapter7;
public class Police extends Human {
Police(String name, String gender, String job) {
super(name, gender, job);
}
@Override
public void showRole() {
System.out.println("경찰입니다");
System.out.println("ID : " + this.id );
System.out.println("이름 : " + this.name);
System.out.println("성별 : " + this.gender);
}
}
Doctor class
package Chapter7;
public class Doctor extends Human{
Doctor(String name, String gender, String job) {
super(name, gender, job);
}
@Override
public void showRole() {
System.out.println("의사 입니다");
System.out.println("ID : " + this.id );
System.out.println("이름 : " + this.name);
System.out.println("성별 : " + this.gender);
}
}
Developer class
package Chapter7;
public class Developer extends Human{
Developer(String name, String gender, String job) {
super(name, gender, job);
}
@Override
public void showRole() {
System.out.println("개발자 입니다");
System.out.println("ID : " + this.id );
System.out.println("이름 : " + this.name);
System.out.println("성별 : " + this.gender);
}
}
class 사용하기
package Chapter7;
public class task {
public static void main(String[] args) {
Human police = new Police("둘리","남","경찰");
Human doctor = new Doctor("또치","남","의사");
Developer developer = new Developer("마이콜","여","개발");
police.showRole();
doctor.showRole();
developer.showRole();
police.updatgInfo("박상윤","여");
System.out.println("name"+police.name+" gender"+police.gender);
}
}
출력결과

Controller
package Chapter7;
public interface Controller {
void pressPlusButton();
void pressMinusButton();
void pressUPButton();
void pressDownButton();
void on();
void off();
}
TvController
package Chapter7;
public class TvController implements Controller{
boolean powerFlag;
int channel = 0;
int volumn = 0;
TvController(int channel, int volumn){
this.channel = channel;
this.volumn = volumn;
this.powerFlag = true;
}
@Override
public void pressPlusButton() {
if(powerFlag){
System.out.println("채널 올려");
System.out.println("현재 채널 : " + ++this.channel);
}else{
System.out.println("티비 꺼져 있음");
}
}
@Override
public void pressMinusButton() {
if(powerFlag){
System.out.println("채널 줄여");
System.out.println("현재 채널 : " + --this.channel);
}else{
System.out.println("티비 꺼져 있음");
}
}
@Override
public void pressUPButton() {
if(powerFlag){
System.out.println("볼륨 올려");
System.out.println("현재 볼륨 : " + ++this.volumn);
}else{
System.out.println("티비 꺼져 있음");
}
}
@Override
public void pressDownButton() {
if(powerFlag){
System.out.println("볼륨 줄여");
System.out.println("현재 볼륨 : " + --this.volumn);
}else{
System.out.println("티비 꺼져 있음");
}
}
@Override
public void on() {
if(this.powerFlag){
System.out.println("이미 켜짐");
return;
}
System.out.println("티비 켜짐");
powerFlag = true;
}
@Override
public void off() {
if(!this.powerFlag){
System.out.println("이미 꺼짐");
return;
}
System.out.println("티비 꺼짐");
powerFlag = false;
}
public void showTvInformation(){
if(powerFlag){
System.out.println("전원 상태:" + this.powerFlag);
System.out.println("channel:"+this.channel);
System.out.println("volumn:"+this.volumn);
}else{
System.out.println("전원꺼져있다.");
}
}
}
TV controller 사용하기
package Chapter7;
public class task2 {
public static void main(String[] args) {
TvController remote = new TvController(24,19);
remote.on();
remote.pressDownButton();
remote.pressMinusButton();
remote.pressPlusButton();
remote.pressUPButton();
remote.showTvInformation();
remote.off();
}
}
출력결과
