OOP ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ด๋?
ํด๋์ค์ ๊ฐ์ฒด
์์ฑ์
OOP์ 4๊ฐ์ง ํน์ง
SOLID ์์น
๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ด ๋ฑ์ฅํ๊ธฐ ์ ์๋ ํ๋ก๊ทธ๋๋ฐ์ ์ค๊ณ ์์ค์ด๋ ์์์ ๋ฐ๋ฅธ ๊ตฌ์กฐ๊ฐ ๋ณต์กํ ํธ์ด ์๋์๋ค. ์ ์ ๋ณต์กํ ์ดํ๋ฆฌ์ผ์ด์
์ ์ค๊ณ๊ฐ ํ์ํ๊ณ ์ด์ ๋ฐ๋ผ ์ค์ ์ธ๊ณ์ ๋น์ทํ ๋ชจ๋ธ๋ง ๋ฐฉ์์ด ์๊ตฌ๋๋ค. ๊ทธ๋์ ๋ํ๋ ๊ฒ์ด ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ(Object Oriented Programming)์ด๋ค. OOP์ ํต์ฌ์ ๊ฐ์ฒด์ ํด๋์ค๋ผ๊ณ ํ ์ ์๋ค. ์ด๋ค์ ์ค์ ๊ฐ์ฒด์ ๊ฐ์ ๋ฐ์ดํฐ์ ํ๋์ด๋ผ๋ 2๊ฐ์ง ํน์ง์ ๊ฐ์ง๊ณ ์๋ค.
๋ฐ์ดํฐ - ๊ฐ์ฒด์ ์์ฑ๊ณผ ์ํ
ํ๋ - ์ค์ค๋ก ๋ณํ๊ณ ๋ค๋ฅธ ๋ฌผ์ฒด์ ์ํต
๊ฐ์ฒด๋ ํด๋์ค์ ์ธ์คํด์ค์ด๋ค. ๊ฐ๊ฐ์ ๊ฐ์ฒด๋ ์ํ, ํ๋ ๊ทธ๋ฆฌ๊ณ ์๋ณ์๋ฅผ ๊ฐ๊ณ ์๋ค. ๋ํ ๊ฐ์ฒด๋ค์ ์๋ก๊ฐ์ ํธ์ถ์ ํตํด ํต์ ํ ์ ์์ผ๋ฉฐ ์ด๋ฅผ message passing์ด๋ผ๊ณ ํ๋ค. ํ๋์ ํด๋์ค๋ฅผ ํตํด ํ์๋ก ํ๋ ์ดํ๋ฆฌ์ผ์ด์ ์ ์ฌ๋ฌ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์๋ค.
์์ฑ์๋ ๋ฐํ ๊ฐ์ด ์๋ ํน์ํ ๋ฉ์๋์ด๋ค. ์์ฑ์์ ์ด๋ฆ์ ํญ์ ํด๋์ค์ ์ด๋ฆ๊ณผ ๋์ผํ๊ณ ์ด๊ธฐ ๊ฐ์ฒด ์ํ๋ฅผ ์ค์ ํ๊ธฐ ์ํ ๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค. ์์ฑ์๋ฅผ ์์ฑํ์ง ์๋ ๊ฒฝ์ฐ JVM์ ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ํ ๋นํ๋ฉฐ ์ด๋ ๋งค๊ฐ๋ณ์๋ฅผ ํ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ ๋งค๊ฐ๋ณ์๊ฐ ํ์ํ ๊ฒฝ์ฐ์๋ ๊ฐ๋ฐ์๊ฐ ์ง์ ์์ฑ์๋ฅผ ์์ฑํด์ผ ํ๋ค.
- ์ถ์ํ(Abstration)
- ์บก์ํ(Encapsulation)
- ๋คํ์ฑ(Polymorphism)
- ์์์ฑ(Inheritance) => ๋ค์๊ณผ ๊ฐ์ ํน์ง์ผ๋ก ์ธํด ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ์ ์ฆ๊ฐํ๊ณ ์ ์ง๋ณด์๋ฅผ ์ฝ๊ฒ ํ๊ธฐ ์ํด ๊ฐ์ฒด์งํฅ์ ์ผ๋ก ํ๋ก๊ทธ๋๋ฐ์ ํ๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
์ถ์ํ๋ ์ปจํ ์คํธ์ ๊ด๋ จ์ด ์๋ ์ ๋ณด๋ฅผ ์จ๊ธฐ๊ฑฐ๋ ๊ด๋ จ๋ ์ ๋ณด๋ง ์ ์ ์๋๋ก ํ๋ ๊ฒ์ด๋ค.
์ถ์ํ๋ ๋ฐ์ดํฐ ์ถ์ํ, ์ ์ด ์ถ์ํ ๋ ๊ฐ์ง๊ฐ ์๋ค.
๋ฐ์ดํฐ ์ถ์ํ๋ ๋ณต์กํ ๋ฐ์ดํฐ ํํ๋ฅผ ์์ฑํ๊ธฐ ์ํด ์ฌ๋ฌ ์์ ๋ฐ์ดํฐ ํ์ ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์๋ฏธ
public class Shape
{
private Rectangle rec;
private Circle cir;
private Triangle tri;
...
}public class changeShape{
public static circleToTriagle(){
...
}
}์๋ฐ์ ์ ๊ทผ ์ ์ด
- public
- protected
- default
- private
์บก์ํ๋ ๊ด๋ จ์ด ์๋ ๋ณ์์ ํจ์๋ฅผ ํ๋์ ํด๋์ค๋ก ๋ฌถ๊ณ ์ธ๋ถ์์ ์ฝ๊ฒ ์ ๊ทผํ์ง ๋ชปํ๋๋ก ์๋ํ๋ ๊ฒ์ ๋๋ค. ๊ฐ์ฒด์ ์ง์ ์ ์ธ ์ ๊ทผ์ ๋ง๊ณ ์ธ๋ถ์์ ๋ด๋ถ์ ์ ๋ณด์ ์ง์ ์ ๊ทผํ๊ฑฐ๋ ๋ณ๊ฒฝํ ์ ์๊ณ ๊ฐ์ฒด๊ฐ ์ ๊ณตํ๋ ํ๋์ ๋ฉ์๋๋ฅผ ํตํด์๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํฉ๋๋ค. ์บก์ํ์๋ ์ ๋ณด์๋๊ณผ ๊ตฌํ์๋์ ๋ชจ๋ ๊ฐ๊ณ ์๋ค.
์ ๋ณด์๋ ๋ฐฉ๋ฒ์ผ๋ก๋ ์ ๊ทผ์ ์ด์๋ฅผ ์ฌ์ฉํ์ฌ ์ธ๋ถ์์ ์ ๊ทผํ ์ ์๋๋ก ํ๋ฉฐ ์ธํฐํ์ด์ค๋ฅผ ํตํด ๊ตฌํ์๋์ ๋ฌ์ฑํ๋ ๊ฒ์ ๋๋ค. ๊ตฌํ์๋์ ๊ฐ์ฒด๊ฐ ์ฑ ์์ ์ดํํ๋ ๋ฐฉ์์ ์์ ํ ์ ์๋๋ก ๊ฐ๋ฐ์์๊ฒ ์์ ๋ฅผ ์ ๊ณตํ๋ค. ์ด๋ ์ค๊ณ๊ฐ ๋ณ๊ฒฝ ๋ ๋ ์ ์ฉํ๊ฒ ์์ฉํ ์ ์๋ค.
//์บก์ํ ํด๋์ค
package com.encapsulationExample;
public class EncapsulationClass {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//๋ฉ์ธ
package com.encapsulationExample;
public class Main {
public static void main(String[] args) {
// write your code here
EncapsulationClass cap = new EncapsulationClass();
cap.setId(123);
cap.setName("jay");
System.out.println(cap.getId());
System.out.println(cap.getName());
}
}
//์ถ๋ ฅ
123
jay๋คํ์ฑ์ ๊ฐ์ ์๋ฃํ์ ์ฌ๋ฌ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ๋์ ํ์ฌ ๋ค์ํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ด๋ด๋ ์ฑ์ง์ ์๋ฏธํ๋ค. ์ด๋ฅผ ํตํด ๋์ผํ ์ด๋ฆ์ ๊ฐ์ ์ฌ๋ฌ ํํ์ ๋ฉ์๋๋ฅผ ๋ง๋ค ์ ์๋ค. compile time polymorphism, runtime polymorphism ๋๊ฐ์ง๊ฐ ์๋ค.
compile time์ ์ปดํ์ผ๋ฌ๊ฐ ํ์ํ ๋ชจ๋ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๊ณ ํ๋ก๊ทธ๋จ ์ปดํ์ผ ์ค์ ํธ์ถํ ๋ฐฉ๋ฒ์ ์๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ ์๊ฐ์ ์ ์ ํ ๋ฉ์๋๋ฅผ ๊ฐ๊ฐ์ ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉํ ์ ์๋ค.
runtime์ ๋์ ๋ฐ์ธ๋ฉ์ผ๋ก ๋ถ๋ฆฌ๊ณ ๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ฉ๊ณผ ์ฐ๊ด์๋ค. ๋ฐํ์ ๋คํ์ฑ์ ๋ถ๋ชจ ํด๋์ค์ ์์ ํด๋์ค๊ฐ ์กด์ฌํ ๋ ์ฌ์ฉ๋๋๋ฐ ๋ถ๋ชจ ์์ ํด๋์ค์ ์กด์ฌํ๋ ๋ฉ์๋๋ฅผ ์คํ์ํค๊ฒ ๋๋ฉด ๋ฐํ์ ๊ณผ์ ์์ ํด๋น ์ธ์คํด์ค์ ๋ง๋ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ฒ ๋๋ค.
class Animal {
public void sound(){
System.out.println("Sound...");
}
}
class Dog extends Animal{
public void sound(){
System.out.println("war war");
}
}
class cat extends Animal{
...
}
public static void main(String[] args){
Animal animal = new Animal();
animal.sound(); // Sound ...
Animal animal = new Dog();
abunal.sound(); // war war
}์์์ ํ๋์ ํด๋์ค๊ฐ ๋ถ๋ชจํด๋์ค์ ์์ฑ๊ณผ ํ๋์ ์ป๊ฒ๋๋ ๋ฐฉ๋ฒ์ผ๋ก ์์์ ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ๊ณผ ์ ์ง๋ณด์๋ฅผ ์ํด ์ฌ์ฉ๋๋ค. ์์์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ extends ํค์๋๋ฅผ ์์ ๋ฐ์ ํด๋์ค์ ๋ช ์ํ์ฌ ์ฌ์ฉํ ์ ์๋ค. ์์๋๋ ํด๋์ค๋ super ํด๋์ค๋ผ ๋ถ๋ฅด๊ณ ์๋กญ๊ฒ ์์ฑ๋ ํด๋์ค๋ฅผ sub ํด๋์ค๋ผ ํ๋ค.
class ์์ํด๋์ค extends ๋ถ๋ชจํด๋์ค {
//ํ๋
//์์ฑ์
//๋ฉ์๋
}
//๋ถ๋ชจ ํด๋์ค๋ก Extendํ๋ ๊ฒ์ด์ง ์์ํด๋์ค๋ฅผ ๋ถ๋ชจ ํด๋์ค๊ฐ Extendํ๋ ๊ฒ์ด ์๋.- OOP 4๋ ํน์ฑ :์ฃผ๋ฐฉ๋๊ตฌ(utensil)
- ์ถ์ํ, ์์, ์บก์ํ, ๋คํ์ฑ
- OOD(๊ฐ์ฒด ์งํฅ ์ค๊ณ) 5์์น :์ฃผ๋ฐฉ ๋๊ตฌ ์ค๋ช
์
- SOLID
- DP(๋์์ธ ํจํด) :๋ ์ํผ
- SRP(Single Responsibility Principle) ๋จ์ผ ์ฑ ์ ์์น
- OCP(Open Close Principle) ๊ฐ๋ฐ ํ์์ ์์น
- LSP(Liskov Substitution Priciple) ๋ฆฌ์ค์ฝ๋ธ ์นํ์ ์์น
- ISP(Interface Segregation Principle) ์ธํฐํ์ด์ค ๋ถ๋ฆฌ์ ์์น
- DIP(Dependency Inversion Principle) ์์กด์ฑ ์ญ์ ์ ์์น
- ํด๋์ค๋ ๋จ ํ๋์ ๊ธฐ๋ฅ๋ง์ ๊ฐ์ง๋ค.
- ํด๋์ค์ ๋ณ๊ฒฝ ์ฌ์ ๋ ๋จ ํ๊ฐ์ง์ฌ์ผ ํ๋ค.
์ด๋ค ์ฌ๋์ ๋๊ตฐ๊ฐ์ ์์์ด๋ฉฐ ์น๊ตฌ, ๋ถํ์ง์ ์ญํ ์ ํ๋ค. ๋ง์ฝ ์น๊ตฌ ์ฌ์ด๊ฐ ๋ฉ์ด์ง๊ฒ ๋๋ค๋ฉด ๋์ด์ ๊ฒ์๊ณผ ์ ๋จน๋ ๊ฒ์ ํ์ง ์๊ฒ ๋๋๋ฐ, ๋ ์ด์ ํ์ง ์์ ํ๋์ ์ ์ด ๋๋๊ฒ์ ๋นํจ์จ์ ์ด๋ค.
- ํ์ฅ์๋ ์ด๋ ค์๊ณ , ๋ณ๊ฒฝ์๋ ๋ซํ์์ด์ผ ํ๋ค.
- ๋น์ฆ๋์ค ๋ก์ง์ ๋ณ๊ฒฝ์ด ์๊ฒจ๋, ๊ธฐ์กด ๊ตฌ์ฑ ์์๋ฅผ ์์ ํ์ง ์๊ณ , ๊ตฌ์ฑ ์์๋ฅผ ์ฝ๊ฒ ํ์ฅํด์ ์ฌ์ฌ์ฉํ๋ ๊ฒ์ด ์ด์์ ์ธ ๊ตฌ์กฐ์ด๋ค.
๋๋ฌผ์ด ์ถ๊ฐ๋ ๋๋ง๋ค ๊ธฐ์กด ์ฝ๋๋ฅผ ์์ ํ๊ณ ์๋ค. ์๋์ ๊ฐ์ด ๊ฐ์์ง, ๊ณ ์์ด, ๋ผ์ง๊ฐ ๋๋ฌผ์ ์์ํ๋๋ก ์ฝ๋๋ฅผ ์์ ํ๋ค๋ฉด OCP์ ์ค์ํ๋ ์ฝ๋๊ฐ ๋ ์ ์๋ค.
- ๋ ๋์ ์์ค์ ํด๋์ค ๋ฐ ๊ตฌ์ฑ ์์์ ์ํฅ์ ์ฃผ์ง ์๊ณ ๋ฎ์ ์์ค์ ํด๋์ค๋ฅผ ๋์ฒดํ ์ ์๋ค.
LSP๋ฅผ ์ค์ํ์ง ์์ ์์
ํด๋น ์ฝ๋์์ ArrayList๋ฅผ LinkedList๋ก ์์ ํ ๊ฒฝ์ฐ ArrayList๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๋ ๋ฉ์๋๋ ์์ ์ ํด์ผํ๋ค. ํด๋น ์ฝ๋๋ sum๋ฉ์๋ ํ ๊ณณ๋ง ์์ ํ๋ฉด ๋์ง๋ง ์ฌ๋ฌ๊ตฐ๋ฐ์์ ์ฌ์ฉํ์ ๊ฒฝ์ฐ ๋ชจ๋ ์์ ์ ํด์ผํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์๋ค. ํ์ ํ์์ด ์์ํ์ ์ ๋์ฒดํ ์ ์๋๋ก LSP ์์น์ ์ค์ํ๋๋ก ์ฝ๋๋ฅผ ์์ ํด์ผํ๋ค.
- ํ๋์ ์ผ๋ฐ์ ์ธ ์ธํฐํ์ด์ค๊ฐ ์๋ ์ฌ๋ฌ๊ฐ์ ๋ช ํํ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ค. (SRP :'ํด๋์ค'์ ๋จ์ผ ์ฑ ์์ ๊ฐ์กฐ, ISP :'์ธํฐํ์ด์ค'์ ๋จ์ผ ์ฑ ์์ ๊ฐ์กฐ)
- ์ค์ ์ฌ์ฉ ๊ด๊ณ๋ ์์ง๋ง ์ถ์์ ๋งค๊ฐ๋ก ํธ์ถํจ์ผ๋ก์ ๊ด๊ณ๋ฅผ ๋์จํ๊ฒ ๋ง๋๋ ๊ฒ์ ์๋ฏธ
- ๊ตฌ์ฒด์ ์ธ class๊ฐ ์๋, ์ธํฐํ์ด์ค์ ์์กดํจ์ผ๋ก์จ DIP๋ฅผ ํด๊ฒฐํ๋ค.
์์ด๋ (๊ตฌ์ฒด์ ์ธ)๋ ๊ณ ์ ์์กดํ๊ณ ์๋ค. ๋ง์ฝ ๋ ๊ณ ๊ฐ ์๋ ํผ์ฆ์ ๊ฐ๊ณ ๋๊ณ ์ถ๋ค๋ฉด?
ํด๋น ์์กด๊ด๊ณ๋ฅผ ์ฅ๋๊ฐ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ญ์ ์ํจ๋ค. ๊ตฌ์ฒด์ ์ธ ๋ ๊ณ ์ ์์กดํ๋ ๊ฒ์ผ๋ก ๋ณ๊ฒฝํ๋ค.
SOLID ์์น์ด ๋ฌด์์ธ๊ฐ์?
SOLID ์์น ๋ค์ ์ค๋ช ํด์ฃผ์ธ์
OOP๊ฐ ๋ฌด์์ธ๊ฐ์?







