시냅스

[Java] 객체지향(OOP) 관련 용어 정리 본문

Java, Spring

[Java] 객체지향(OOP) 관련 용어 정리

ted k 2022. 7. 15. 22:20
  • 클래스 (Class)
    • 객체의 청사진(Blueprint)
    • 상태(클래스, 인스턴스 변수)와 행위(메서드)를 갖는 자바의 기본 단위
  • 상속 (Inheritance)
    • 상위 클래스의 변수와 메소드에 대한 사용권을 갖는 것
    • subclassing : 다른 클래스의 코드를 재사용할 목적으로 상속을 사용하는 경우
      • is - a 관계
      • 어휘적 정의가 아닌 기대되는 행동에 따라 타입계층의 의미가 달라질 수 있음.
      • 슈퍼타입과 서브타입 관계에서는 행동 호환성이 중요
    • subtyping : 타입 계층을 구성하기 위해 상속을 사용하는 경우
    • 행동 호환성
      • 두 타입 사이에 행동이 호환될 경우에만 타입계층으로 묶어야 한다.
      • 동일한 메서드를 구현하면 행동을 호환하는것인가?
  • 슈퍼클래스 (Super Class)
    • 상속되는 클래스, 부모 클래스
  • 서브클래스 (Sub Class)
    • 상속 받는 클래스, 자식 클래스
  • 객체 (Object)
    • 객체 지향 프로그래밍의 기본 단위
    • 데이터, 변수, 메서드를 모두 포함
  • 업 캐스팅
    • 부모클래스 자료형에 자식클래스의 인스턴스가 대입
  • 다운 캐스팅
    • 자식클래스 자료형에 부모클래스의 인스턴스가 대입
    • 자식클래스는 부모클래스의 기존 함수보다 추가되는 함수 등 자식클래스의 범위가 더 넓다. 고로 명시적으로 형변환을 해주어야한다.
public class Main {
    public static void main(String[] args) {
        Shape r = new Rectangle(0, 0, 10, 20);
        Circle c = (Circle) new Shape(0, 0, 9, 9);
        System.out.println(r.getArea());
        System.out.println(c.getArea());
    }
}

// 하지만 위의 경우에서 C에서 오류가 발생하는데 역시 범위가 더 넓어, 메소드가 다를수 있기 떄운에 다운캐스팅은 다음과 같이 사용한다.

public class Main {
    public static void main(String[] args) {
        Shape r = new Rectangle(0, 0, 10, 20);
        Shape sc = new Circle(0, 0, 9, 9);
        Circle c = (Circle) sc;
        System.out.println(r.getArea());
        System.out.println(c.getArea());
    }
}
  • 객체 지향 프로그래밍 (Object-Oriented Programming)
    • 객체 (여러 개의 독립된 단위)들의 모임으로 프로그래밍을 파악하고자 하는 것
    • 각각의 객체는 메세지를 주고받고, 데이터를 처리할 수 있다. (협력)
    • 프로그램을 유연하고 변경이 용이하게 만든다.
  • 인스턴스 (Instance)
    • 한 클래스의 특정한 객체
  • 인스턴스화 (Instantiate)
    • 클래스에서 인스턴스를 생성시키는 것
    • new 를 사용해 새로운 객체를 생성하는 것
  • 생성자와 소멸자
    • 생성자는 객체를 초기화하거나 설정하고
    • 소멸자는 객체를 삭제하고 정리
  • 멤버 (Member)
    • 객체 혹은 클래스의 변수나 메서드
  • 멤버 변수 (Member Variable)
    • 클래스나 객체의 멤버로 클래스 내에서 선언된 멤버 변수
    • static(class) 변수와 instance 변수가 있음
    • static은 모든 객체가 공통적으로 사용
    • instance 변수는 각 객체들마다 따로 생성 되어 개별적으로 사용하는 변수
  • 멤버 함수 (Member Function)
    • 클래스 내에서 선언된 함수
  • 식별자 (Identifier)
    • 변수, 함수, 상수, 배열, 클래스, 메서드 등에 부여하는 이름
  • 접근 제한자 (Access Modifier)
    • public : 모든 접근을 허용
    • protected : 같은 패키지에 있는 객체와 상속관계의 객체들만 허용
    • default : 같은 패키지에 있는 객체들만 허용
    • private : 현재 객체 내에서만 허용
  • 추상화 (Abstraction)
    • 어떤 대상(객체)을 표현하는 데 있어 일부 특성들만 표현하는 것
    • 개별적인 대상들의 공통점을 모아 클래스 또는 인터페이스화 하는 것
    • 추상클래스는 객체가 가지는 특성들을 추상화 시켜 놓았을 뿐이므로 구체화가 필요하다. -> 객체를 생성할 수 없다.
  • 정보 은닉 (Information hiding)
    • 접근할 수 있는 범위를 성정하여 정보를 은닉하는 것
  • 캡슐화 (Encapsulation)
    • 정보 은닉의 하위 개념 중 하나
    • 객체의 필드를 비공개로 하고 필요한 경우에만 메소드 공개를 설정하는 것
  • 다형성 (Polymorphism)
    • 역할과 구현으로 세상을 구분
    • 하나의 객체가 서로 다른 타입과 기능으로 동작할 수 있음을 의미.
    • 인터페이스(역할)에서 파생된 클래스들(구현체)의 기능이 각각 다를 수 있음
    • 클라이언트는 구현 대상의 내부 구조를 몰라도 된다.
    • 클라이언트는 구현 대상의 내부 구조가 변경되어도 영향을 받지 않는다.
    • 클라이언트는 구현 대상 자체를 변경해도 영향을 받지 않는다.
import java.util.HashMap;

class PolyShape {
    void draw() {}    // 자녀클래스에서 상속받아서 사용할 메서드를 정의
}

class PolyLine extends PolyShape {
    void draw() {        // 부모클래스의 메서드를 자신에게 맞게 재정의
        System.out.println("선을 그린다.");
    }
}

class PolyCircle extends PolyShape {

    void draw() {        // 부모클래스의 메서드를 자신에게 맞게 재정의
        System.out.println("원을 그린다.");
    }
}

class PolyRect extends PolyShape {

    void draw() {        // 부모클래스의 메서드를 자신에게 맞게 재정의
        System.out.println("사각형을 그린다.");
    }
}

public class OOPEx11 {
    public static void main(String[] args) {
        PolyShape[] shape = { new PolyLine() ,  new PolyCircle() , new PolyRect()};

        shape[0].draw(); // 재정의 된 메서드가 구현
        // 선을 그린다.
        shape[1].draw(); // 재정의 된 메서드가 구현
        // 원을 그린다.
        shape[2].draw(); // 재정의 된 메서드가 구현
        // 사각형을 그린다.

    }
}
  • 메서드 재정의 (Overrding)
    • super class에 있는 메서드와 식별자는 동일하지만 구현이 다른 경우
    • 변경
  • 메서드 오버로딩 (Overloading)
    • super class에 있는 메서드와 식별자는 동일하지만 매개변수를 다르게 하여 추가로 정의한 것
    • 추가
  • 추상클래스 (Abstract Class)
    • 미완성된 설계도
    • 객체를 생성할 수 없다.
    • 다중 상속 불가
    • extends
abstract class Shape {
    public abstract void darw();
    public void test99() {
        System.out.println("일반 메서드");
    }
}

class Line extends Shape {
    @Override
    public void draw() {
        System.out.println("Line");
    }
}

class Rect extends Shape {
    @Override
    public void draw() {
        System.out.println("Rect");
    }
}
  • 인터페이스 (Interface)
    • 기본적인 설계도
    • 상속받은 클래스는 모든 메서드를 오버라이딩 해야 됨.
    • 다중 상속(구현) 가능
    • implements
interface PhoneInterface {
    final int TIMEOUT = 1000;
    void sendCall();
    void receiveCall();
    dafault void printLogo() {
        System.out.println("Phone");
    }
}

class Calc {
    public int calculate(int x, int y)
    {
        return x + y;
    }
}
class SmartPhone extends Calc implements PhoneInterface {
    @java.lang.Override
    public void sendCall() {
        System.out.println("따르릉~!~");
    }

    @java.lang.Override
    public void receiveCall() {
        System.out.println("전화왔어요");
    }

    publc void schedule() {
        System.out.println("일정관리합니다.");
    }
}

public class InterfaceEx {
    public static void main(String[] args){
        SmartPhone phone = new SmartPhone();
        phone.printLogo();
        phone.sendCall();
        System.out.println("3과 5를 더하면 " + phone.calculate(3, 5));
        phone.schedule();
    }
}
  • 디자인 패턴

    • 소프트웨어를 설계할 때 특정 맥락에서 자주 발생하는 고질적인 문제들이 또 발생했을 때 재사용할 할 수있는 훌륭한 해결책
    • 3가지의 디자인 패턴을 정리하고 각각의 디자인 패턴을 생성(Creational), 구조(Structural), 행위(Behavioral) 3가지로 분류
  • 생성(Creational) 패턴

    • 객체 생성에 관련된 패턴
    • 객체의 생성과 조합을 캡슐화해 특정 객체가 생성되거나 변경되어도 프로그램 구조에 영향을 크게 받지 않도록 유연성을 제공한다.
    • ex) 추상팩토리, 빌더, 팩토리메소드, 프로토타입, 싱글턴
  • 구조(Structural) 패턴

    • 클래스나 객체를 조합해 더 큰 구조를 만드는 패턴
    • 예를 들어 서로 다른 인터페이스를 지닌 2개의 객체를 묶어 단일 인터페이스를 제공하거나 객체들을 서로 묶어 새로운 기능을 제공하는 패턴이다.
    • ex) 어댑터, 브리지, 컴퍼지트, 데커레이터, 퍼사드, 플라이웨이트, 프록시
  • 행위(Behavioral)

    • 객체나 클래스 사이의 알고리즘이나 책임 분배에 관련된 패턴
    • 한 객체가 혼자 수행할 수 없는 작업을 여러 개의 객체로 어떻게 분배하는지, 또 그렇게 하면서도 객체 사이의 결합도를 최소화하는 것에 중점을 둔다.
    • ex) 책임연쇄, 커맨드, 인터프리터, 이터레이터, 미디에이터, 메멘토, 옵서버, 테이트, 스트래티지, 템플릿 메서드, 비지터

'Java, Spring' 카테고리의 다른 글

IOC와 DI, 컨테이너  (0) 2022.07.25
좋은 객체 지향 설계의 5가지 원칙 (SOLID)  (0) 2022.07.15
[Java] Generic - 와일드 카드 Wildcard  (0) 2022.07.11
[JAVA] Equals와 hashcode  (0) 2022.07.11
자바 가상 머신, JVM이란  (0) 2022.07.11
Comments