- 객체지향 프로그래밍(OOP, Object Oriented Programming)
객체지향 프로그래밍이란 : 프로그램을 객체로 구성하는 것
배경 : 프로그램이 대규모, 거대화되면서 등장하게 됨
아이디어 : 어떻게 큰 프로그램을 만들 것인가?
프로그램의 동작을 객체들에게 나눠서 수행(Coupling low, Cohensive high)
개념적인 용어 : 객체 / 기술적인 용어 : class, instance
객체는 작은 기능을 수행함 고로 객체와 객체는 서로 협력해야함
객체를 서로 구분할 필요가 있다 (type(형)으로 구분)
type 만들기(class 만들기)
package com.programmers.java;
import java.lang.*;
class MyObject extends Object implements Runnable{
privte int a = 0; // 필드 영역
public void run(){ // 메소드 영역
a += 1;
}
}
MyObject obj = new MyObject(); //객체생성
객체가 어떤 책임, 기능을 맡게 할 것인지 정하는게 개발자
- 객체지향의 특성
캡슐화(Encapsulation)
완성도가 있다
정보가 은닉되어 있다
(밖에서 객체 내의 정보에 접근하지 못하게 한다)
객체는 스스로 동작할 수 있는 환경을 갖고 있어야한다
class Animal{ // 예시
private Heart heart; // 접근지정자 private
private Blood blood;
void donation(){
return null;
}
}
class Human entends Animal{ // Human은 Animal을 상속받았지만 private인 heart와, blood에 접근하지 못함
void run(){
return
}
}
접근지정자(Access Modifier)
접근지정자 | 접근 범위 | 동일클래스 | 동일패키지 | 다른 패키지의 자식클래스 | 다른 패키지 |
---|---|---|---|---|---|
public | 어디서든 접근 가능 | ㅇ | ㅇ | ㅇ | ㅇ |
protected | 동일패키지와 상속된 객체에서도 접근 가능 | ㅇ | ㅇ | ㅇ | |
default | 동일패키지 내에서만 | ㅇ | ㅇ | ||
private | 동일 클래스 내에서만 | ㅇ |
상속(Inheritance)
상위 클래스, (부모, super, 추상적)
하위 클래스, (자식, this, 구체적)
오해
추상화(Abstraciton)
추상화된 객체 : 추상체
구체적인 객체 : 구상체
서로 대조적인 관계
객체간의 관계에서 '상위에 있는 것이 항상 하위보다 추상적이어야 한다'
class Login{ // 의미적 추상체
void login(){}; // 메소드를 갖고 구현화 된 상태지만 KakaoLogin 덕분에 의미적 추상체라고 본다. 즉 구체적/추상적을 나누는 기준은 상대적이다.
}
class KakaoLogin extends Login{
void login(){};
}
abstract class Login{ // abstract 메소드을 가진 추상클래스, interface와 차이는 구체화된 메소드나 요소가 존재할 수 있다.
abstract void login(); // 구현화 안 된 상태
}
class KakaoLogin extends Login{
@Override void login(){}; // 구현화된 상태
}
// 객체자체가 추상적
interface Login{ // 모든 것이 다 추상으로만 이루어진 객체 == interface
void login(); // 구현화 안 된 상태
}
class KakaoLogin implements Login{
@Override void login(){}; // 구현화된 상태
}
다형성(Polymorphism)
type(형)을 여러가지로 표현할 수 있는 성질
interface Login{ // 모든 것이 다 추상으로만 이루어진 객체 == interface
void login(); // 구현화 안 된 상태
}
interface Portal{ // 모든 것이 다 추상으로만 이루어진 객체 == interface
void portal(); // 구현화 안 된 상태
}
class KakaoLogin implements Login{
@Override void login(){}; // 구현화된 상태
}
class NaverLogin implements Login, Portal{
@Override void login(){}; // 구현화된 상태
@Override void portal(){}; // 구현화된 상태
}
Login login = new Login();
Login login= new KakaoLogin();
Login login = new NaverLogin();
Portal potal = new NaverLogin();
//이렇게 만들면 potal은 NaverLogin의 객체지만
// void login()에 접근 불가능함
// 이를 위해서 추상화를 하는것임
// 권한을 가진 부분만 주고, 서로의 접근을 막기위해
추상 클래스를 만드는 이유
- UML(객체지향설계1, 어떻게 하면 객체지향을 잘 할 수 있는 것인가)
객체지향 프로그래밍 : 기능을 객체에게 나눠서 수행시킨다
설명하기 위한 도구 : UML (따로 정리해서 블로그에 올리기)
Usecase Diagram
Sequence Diagram
Package Diagram
Class Diagram(제일 중요!!!)
- 객체지향설계 2
어떻게 하면 객체를 잘 나누고 연관지을 수 있는가?
SRP(Single Responsiblity Principle, 단일 책임 원칙)
OCP(Open-Closed Principle, 개방-폐쇄 원칙)
LSP(Liskov Substitution Principle, 리스코프 치환 원칙)
ISP(Interface Segregation Principle, 인터페이스 분리 원칙)
DIP(Dependency Inversion Principle, 의존성 역전 법칙)
GoF의 디자인패턴
안녕하세요. 정리가 아주 깔끔하게 잘 되어 있네요.
덕분에 자바의 기본 개념을 다시 정립할 수 있어서 아주 좋은 포스팅이라고 생각합니다.
자주 놀러올게요. 😎