Java

[Java] OOP의 특징

quedevel 2020. 12. 27. 17:01
728x90
반응형

1) 캡슐화

데이터와 코드의 형태를 외부로부터 알 수 없게 하고, 데이터의 구조와 역할, 기능을 하나의 캡슐형태로 만드는 방법이다.

public class Member {
    private String mbrId;
    private String mbrNm;
    private Integer age;

    public String getMbrId() {
        return mbrId;
    }

    public void setMbrId(String mbrId) {
        this.mbrId = mbrId;
    }

    public String getMbrNm() {
        return mbrNm;
    }

    public void setMbrNm(String mbrNm) {
        this.mbrNm = mbrNm;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

이처럼 클래스(Member)의 맴버변수들에 private 접근 제어자를 붙여 은닉화를 시켜 외부로부터 데이터를 보호하고, 외부에는 불필요한, 내부적으로만 사용되는, 부분을 감춘다

2) 상속

상속이란, 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다.

Animal 부모 클래스

public class Animal {
    private String kind;

    public String getKind() {
        return kind;
    }

    public void setKind(String kind) {
        this.kind = kind;
    }
}

Dog & Bird 자손 클래스

public class Dog extends Animal {
    public Dog() {
        this.setKind("dog...");
    }
}
public class Bird extends Animal{
    public Bird() {
        this.setKind("bird...");
    }
}

Dog & Bird에 변수 kind를 선언하지 않았지만 Animal을 상속 받았기 때문에 사용이 가능하다.

public class Main {
    public static void main(String[] args) {
        Animal dog = new Dog();
        Animal bird = new Bird();
        System.out.println(dog.getKind());
        System.out.println(bird.getKind());
    }
}

실행 결과

C:\jdk1.8\bin\java.exe "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=14047:C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath C:\jdk1.8\jre\lib\charsets.jar;C:\jdk1.8\jre\lib\deploy.jar;C:\jdk1.8\jre\lib\ext\access-bridge-64.jar;C:\jdk1.8\jre\lib\ext\cldrdata.jar;C:\jdk1.8\jre\lib\ext\dnsns.jar;C:\jdk1.8\jre\lib\ext\jaccess.jar;C:\jdk1.8\jre\lib\ext\jfxrt.jar;C:\jdk1.8\jre\lib\ext\localedata.jar;C:\jdk1.8\jre\lib\ext\nashorn.jar;C:\jdk1.8\jre\lib\ext\sunec.jar;C:\jdk1.8\jre\lib\ext\sunjce_provider.jar;C:\jdk1.8\jre\lib\ext\sunmscapi.jar;C:\jdk1.8\jre\lib\ext\sunpkcs11.jar;C:\jdk1.8\jre\lib\ext\zipfs.jar;C:\jdk1.8\jre\lib\javaws.jar;C:\jdk1.8\jre\lib\jce.jar;C:\jdk1.8\jre\lib\jfr.jar;C:\jdk1.8\jre\lib\jfxswt.jar;C:\jdk1.8\jre\lib\jsse.jar;C:\jdk1.8\jre\lib\management-agent.jar;C:\jdk1.8\jre\lib\plugin.jar;C:\jdk1.8\jre\lib\resources.jar;C:\jdk1.8\jre\lib\rt.jar;C:\Users\kdh90\Desktop\Keep-studying\javaEX\out\production\javaEX com.company.Main
dog...
bird...
Process finished with exit code 0

이처럼 만약 자손 클래스의 인스턴스를 생성하면 조상 클래스의 맴버와 자손 클래스의 맴버가 합쳐진 하나의 인스턴스로 생성된다.

3) 추상화

추상화Abstraction란? 추상화의 사전적 의미는 특정한 개별 사물과 관련되지 않은 공통된 속성이나 관계 등을 뽑아내는 것이다. 이를 컴퓨터 관점에서 생각해보면, 추상화란 데이터나 프로세스 등을 의미가 비슷한 개념이나 표현으로 정의해 나가는 과정이면서 동시에 각 개별 개체의 구현에 대한 상세함은 감추는 것, 이것이 추상화라고 할 수 있다.

Animal 부모 클래스

public abstract class Animal {
    abstract void cry();
}

Dog & Bird 자손 클래스

public class Dog extends Animal {
    @Override
    public void cry() {
        System.out.println("멍멍");
    }
}
public class Bird extends Animal{
    @Override
    public void cry() {
        System.out.println("짹짹");
    }
}

실행

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        Bird bird = new Bird();
        dog.cry();
        bird.cry();
    }
}

결과

C:\jdk1.8\bin\java.exe "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=3544:C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath C:\jdk1.8\jre\lib\charsets.jar;C:\jdk1.8\jre\lib\deploy.jar;C:\jdk1.8\jre\lib\ext\access-bridge-64.jar;C:\jdk1.8\jre\lib\ext\cldrdata.jar;C:\jdk1.8\jre\lib\ext\dnsns.jar;C:\jdk1.8\jre\lib\ext\jaccess.jar;C:\jdk1.8\jre\lib\ext\jfxrt.jar;C:\jdk1.8\jre\lib\ext\localedata.jar;C:\jdk1.8\jre\lib\ext\nashorn.jar;C:\jdk1.8\jre\lib\ext\sunec.jar;C:\jdk1.8\jre\lib\ext\sunjce_provider.jar;C:\jdk1.8\jre\lib\ext\sunmscapi.jar;C:\jdk1.8\jre\lib\ext\sunpkcs11.jar;C:\jdk1.8\jre\lib\ext\zipfs.jar;C:\jdk1.8\jre\lib\javaws.jar;C:\jdk1.8\jre\lib\jce.jar;C:\jdk1.8\jre\lib\jfr.jar;C:\jdk1.8\jre\lib\jfxswt.jar;C:\jdk1.8\jre\lib\jsse.jar;C:\jdk1.8\jre\lib\management-agent.jar;C:\jdk1.8\jre\lib\plugin.jar;C:\jdk1.8\jre\lib\resources.jar;C:\jdk1.8\jre\lib\rt.jar;C:\Users\kdh90\Desktop\Keep-studying\javaEX\out\production\javaEX com.company.Main
멍멍
짹짹
Process finished with exit code 0

이처럼 클래스간의 공통점을 찾아내서 공통의 조상을 만드는 작업으로 상속을 통해 클래스를 구현, 확장하는 작업이다.

4) 다형성

객체지향개념에서 다형성이란 '여러 가지 형태를 가질 수 있는 능력'을 의미하며, 자바에서는 한 타입의 참조변수로 여러타입의 객체를 참조할 수 있도록 함으로써 다형성을 프로그램적으로 구현하엿다.

public class Main {
    public static void main(String[] args) {
        List<Dog> list1 = new ArrayList<>();
        List<Dog> list2 = new LinkedList<>();
        List<Dog> list3 = new Stack<>();
        List<Dog> list4 = new Vector<>();
    }
}

조상클래스 타입의 참조변수로 자손 클래스의 인스턴스를 참조할 수 있도록 하는것이다.

 

 

 

 

 

728x90
반응형

'Java' 카테고리의 다른 글

[Java] 인터페이스(interface)  (0) 2020.12.30
[Java] 오버로딩 VS 오버라이드  (0) 2020.12.27
[Java] 객체지향언어  (0) 2020.12.27
[Java] Lambda & Stream 3  (0) 2020.02.26
[Java] Lambda & Stream 2  (0) 2020.02.26