๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ•Š๏ธ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฐ๋ธŒ์ฝ”์Šค

ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์œ„ํ•œ JAVA - OOP

by hyeon-z 2023. 6. 11.

 

OOP ์ด์•ผ๊ธฐ

1. ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

 

Java๊ฐ€ ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด์ด๊ธด ํ•˜์ง€๋งŒ Java๋กœ ๊ฐœ๋ฐœํ•œ๋‹ค๊ณ  ๋ชจ๋‘ ๊ฐ์ฒด์ง€ํ–ฅ์ธ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.

 

๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€?

 

ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐ์ฒด๋กœ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ

 

๐Ÿš€ ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ: ํ”„๋กœ๊ทธ๋žจ์ด ๊ฑฐ๋Œ€ํ™”ํ•˜๋ฉด์„œ ๋“ฑ์žฅ
๐Ÿ’ก ์•„์ด๋””์–ด: ์–ด๋–ป๊ฒŒ ํฐ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ๊ฒƒ์ธ๊ฐ€? (๋” ํšจ์œจ์ ์ด๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์ข‹๊ฒŒ)
โœ… ํ•ด๊ฒฐ์ฑ…: ์ž‘๊ฒŒ ๋‚˜๋ˆ ์„œ ๋งŒ๋“  ํ›„ ํ•ฉ์น˜์ž

ํ”„๋กœ๊ทธ๋žจ์˜ ๋™์ž‘์„ ๊ฐ์ฒด๋“ค์—๊ฒŒ ๋‚˜๋ˆ ์„œ ์ˆ˜ํ–‰ํ•˜์ž.

 

๊ฐ์ฒด๋ž€ ๋ฌด์—‡์ผ๊นŒ?

 

๐Ÿ‘† ๊ฐœ๋…์  ์šฉ์–ด: ๊ฐ์ฒด
๐Ÿ‘† ๊ธฐ์ˆ ์  ์šฉ์–ด: class, instance

 

๊ฐ์ฒด๋ž€?

- ํฐ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ตฌ์„ฑ์„ ๋‚˜๋ˆˆ ๊ฒƒ

- ๊ธฐ๋Šฅ์˜ ์ผ๋ถ€๋ฅผ ์œ„์ž„๋ฐ›์€ ๊ฒƒ (๊ธฐ๋Šฅ์˜ ์ผ๋ถ€๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค.)

- ์ž‘์€ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

๊ฐ์ฒด์˜ ํŠน์ง•

๊ฐ์ฒด์™€ ๊ฐ์ฒด๋Š” ์„œ๋กœ ํ˜‘๋ ฅ์„ ํ•ด์•ผ ํ•œ๋‹ค.

๐Ÿค”์ด์œ : ํ•จ๊ป˜ ํฐ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํ•ต์‹ฌ

 

๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ž˜ํ•˜๋Š” ๋ฐฉ๋ฒ•

์ผ์„ ์ž˜๊ฒŒ ์ชผ๊ฐœ์„œ ๊ฐ์ฒด์—๊ฒŒ ์œ„์ž„ํ•˜๊ณ , ์„œ๋กœ ํ˜‘๋ ฅํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ.

=> ํ•˜๋‚˜์˜ ์ปค๋‹ค๋ž€ ๊ฐ์ฒด ์•ˆ์— ๋ชจ๋“  ๋กœ์ง์„ ๋„ฃ๋Š” ๊ฒƒ์€ ์ ˆ์ฐจ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ๊ฐ™๋‹ค.(์ง€์–‘ํ•˜๊ธฐ!)

 

๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํ•ต์‹ฌ

๊ฐ์ฒด๋Š” ํŠน์ •ํ•œ ์ž„๋ฌด์™€ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ํ•ด๋‹น ์ผ์„ ํ•ด์•ผ ํ•˜๋Š” ์ฑ…์ž„์„ ๊ฐ–๋Š”๋‹ค. 

๋”ฐ๋ผ์„œ ์ฑ…์ž„์„ ๋‹คํ•˜๋„๋ก ๊ฐ์ฒด๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค.

 

๊ฐ์ฒด์˜ ์—…๋ฌด๋ฅผ ์ž˜๊ฒŒ ์ชผ๊ฐœ๋˜๋น„์Šทํ•œ ์—…๋ฌด๋“ค์€ ํŠน์ • ๊ฐ์ฒด๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์ผ์„ ๋ถ„์•ผ๋ณ„๋กœ ์ชผ๊ฐ  ํ›„ ๊ฐ์ฒด์—๊ฒŒ ์ž˜ ์œ„์ž„ํ•œ๋‹ค.

์ชผ๊ฐœ์ง„ ๊ฐ์ฒด๋“ค์ด ์ž˜ ํ˜‘๋ ฅํ•  ์ˆ˜ ์žˆ๋„๋ก ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ. 

 

๊ฐ์ฒด์˜ ๊ตฌ๋ถ„

 

์ˆ˜๋งŽ์€ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋˜๋ฏ€๋กœ ์ด๋ฅผ ์„œ๋กœ ๊ตฌ๋ถ„ํ•ด์•ผ ํ•œ๋‹ค.

 

type(ํ˜•)์œผ๋กœ ๊ตฌ๋ถ„ํ•˜๊ธฐ

String๊ฐ์ฒด ์ƒ์„ฑ

 

ํƒ€์ž… ๋งŒ๋“ค๊ธฐ (class ๋งŒ๋“ค๊ธฐ)

 

package com.programmers.java;

class MyClass extends Object implements Runnable {
    // field area
    private int a = 0;

    // method area
    public void run() {
        a += 1;
    }

    MyClass mc = new MyClass();
}

MyClass๋ผ๊ณ  ํ•˜๋Š” ํƒ€์ž…์„ ๋งŒ๋“ค์—ˆ๋‹ค. (ํด๋ž˜์Šค ํƒ€์ž…)

ํƒ€์ž…์˜ ๋ณ€์ˆ˜์— ํ•ด๋‹น ํƒ€์ž…์œผ๋กœ ์ƒ์„ฑ๋œ instance๋ฅผ ์ƒ์„ฑ ํ›„ ๋Œ€์ž…ํ•œ๋‹ค.


2. ๊ฐ์ฒด์ง€ํ–ฅ์˜ ํŠน์„ฑ

 

์บก์Аํ™”

 

๐Ÿ‘† ์™„์„ฑ๋„๊ฐ€ ์žˆ๋‹ค.

๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‹จ์œ„๋กœ์จ ์™„์ „ํ•จ์„ ๊ฐ–๋Š”๋‹ค. (๋‹ค๋ฅธ ๊ฐ์ฒด์™€์˜ ์˜์กด์„ฑ์„ ๋‚ฎ์ถ˜๋‹ค)

 

๐Ÿ‘†์ •๋ณด๊ฐ€ ์€๋‹‰๋˜์–ด ์žˆ๋‹ค.

๋ฐ–์—์„œ ๊ฐ์ฒด ๋‚ด์˜ ์ •๋ณด์— ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•œ๋‹ค.

 

โœ… ๊ฒฐ๋ก 

๊ฐ์ฒด๋Š” ์Šค์Šค๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์„ ๊ฐ–๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.

์™ธ๋ถ€์— ์˜์กดํ•˜๊ฑฐ๋‚˜, ์™ธ๋ถ€์˜ ์นจ๋žต์„ ์ œํ•œํ•ด์•ผ ํ•œ๋‹ค.

 

Child๋Š” Parent์˜ Blood์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค. (X)

Child๋Š” Parent์˜ Hair์—๋Š” ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. (O)

 

Childe๊ฐ€ Parent์˜ Blood์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” getBlood()๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•ด์•ผ ํ•œ๋‹ค.

 

class Parent {
    private Blood blood;
    protected Hair hair;

    Blood getBlood() {
        return Blood;
    }
}

class Child extends Parent {
    void run() {
        this.hair; // (O)
        this.blood; // (X)
        this.getBlood(); // (O)
    }
}

=> ์ ‘๊ทผ ์ง€์ •์ž๋ฅผ ํ†ตํ•ด ์บก์Аํ™”๋ฅผ ์กฐ์ ˆํ•œ๋‹ค.

 

โญ ์ ‘๊ทผ ์ง€์ •์ž

private : ๊ฐ์ฒด ์†Œ์œ  (์™ธ๋ถ€์—์„œ ์ ‘๊ทผ ๋ถˆ๊ฐ€๋Šฅ)

protected : ์ƒ์†๋œ ๊ฐ์ฒด์—์„œ๋„ ์ ‘๊ทผ ๊ฐ€๋Šฅ
default(friendly) : ๊ฐ™์€ ํŒจํ‚ค์ง€ ๋‚ด์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅ (ํŒจํ‚ค์ง€ ๊ฐ€์‹œ์„ฑ)
public : ๋ชจ๋‘ ๋‹ค ์ ‘๊ทผ ๊ฐ€๋Šฅ (public class๋Š” ํ•œ ํŒŒ์ผ์— ํ•œ ๊ฐœ)

๋ฒ”์œ„: private < protected < default < public

 

์ƒ์†

 

๐Ÿ’ก ์ƒ์†ํ•ด์ค€๋‹ค: ์ƒ์œ„, ๋ถ€๋ชจ, super, ์ถ”์ƒ
๐Ÿ’ก ์ƒ์†๋ฐ›๋Š”๋‹ค: ํ•˜์œ„, ์ž์‹, this, ๊ตฌ์ฒด

 

์ƒ์†์˜ ์˜คํ•ด: ๊ณตํ†ต๋œ ๊ธฐ๋Šฅ์„ ์—ฌ๋Ÿฌ ๊ฐ์ฒด์—๊ฒŒ ์ „๋‹ฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

์˜ฌ๋ฐ”๋ฅธ ์ƒ์† ๊ด€๊ณ„: ์ถ”์ƒ๊ณผ ๊ตฌ์ฒด (ex. ์›์ž > ๋ฌผ์งˆ > ์ƒ๋ฌผ > ๋™๋ฌผ > ํฌ์œ ๋ฅ˜ > ์‚ฌ๋žŒ > ๋‚จ์ž > ์งฑ๊ตฌ)

 

์ถ”์ƒํ™”

 

๐Ÿ’ก์ถ”์ƒ์ฒด: ์ถ”์ƒํ™”๋œ ๊ฐ์ฒด
๐Ÿ’ก๊ตฌ์ƒ์ฒด: ๊ตฌ์ฒด์ ์ธ ๊ฐ์ฒด

์ถ”์ƒ์ฒด์™€ ๊ตฌ์ƒ์ฒด์˜ ๊ด€๊ณ„๋Š” ์ƒ๋Œ€์ ์ด๋‹ค.

ex)

์‚ฌ๋žŒ > ๋‚จ์ž์˜  ๊ด€๊ณ„:์‚ฌ๋žŒ์ด ์ถ”์ƒ์ฒด๋‚จ์ž๊ฐ€ ๊ตฌ์ƒ์ฒด 

๋‚จ์ž > ์งฑ๊ตฌ์™€์˜ ๊ด€๊ณ„: ๋‚จ์ž๊ฐ€ ์ถ”์ƒ์ฒด, ์งฑ๊ตฌ๊ฐ€ ๊ตฌ์ƒ์ฒด

 

๊ฐ์ฒด ๊ฐ„์˜ ๊ด€๊ณ„์—์„œ ์ƒ์œ„์— ์žˆ๋Š” ๊ฒƒ์ด ํ•ญ์ƒ ํ•˜์œ„๋ณด๋‹ค ์ถ”์ƒ์ ์ด์–ด์•ผ ํ•œ๋‹ค.

 

๐Ÿ‘† ์˜๋ฏธ์  ์ถ”์ƒ์ฒด

class Login {
	void login() {}
}

class GoogleLogin extends Login {
	void login() {}
}

Loginํด๋ž˜์Šค, GoogleLoginํด๋ž˜์Šค์˜ login๋ฉ”์„œ๋“œ๋Š” ๊ฐ๊ฐ์˜ ๊ตฌํ˜„์ฒด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

 

๐Ÿ‘† ์ถ”์ƒ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„ ๊ฐ์ฒด

abstract class Login {
	abstract void login();
}

class GoogleLogin extends Login {
	@Override void login() {}
}

์ถ”์ƒ ํด๋ž˜์Šค: ํ•˜๋‚˜ ์ด์ƒ์˜ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ํด๋ž˜์Šค

GoogleLoginํด๋ž˜์Šค(๊ตฌ์ƒ์ฒด)๋Š” Loginํด๋ž˜์Šค(์ถ”์ƒ์ฒด)์˜ login ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌ์ฒดํ™”์‹œ์ผœ์•ผ ํ•˜๋Š” ์˜๋ฌด๋ฅผ ๊ฐ€์ง„๋‹ค. (๋ฐ˜๋“œ์‹œ Override ํ•ด์•ผ ํ•จ)

 

๐Ÿ‘† ๊ฐ์ฒด ์ž์ฒด๊ฐ€ ์ถ”์ƒ์ 

interface Login {
	void login();
}

class GoogleLogin implements Login {
	@Override void login() {}
}

์ธํ„ฐํŽ˜์ด์Šค(interface): ๋ชจ๋“  ๊ฒƒ์ด ๋‹ค ์ถ”์ƒ์œผ๋กœ๋งŒ ์ด๋ฃจ์–ด์ง„ ๊ฐ์ฒด

์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ตฌํ˜„๋œ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค.

 

๋‹คํ˜•์„ฑ

 

ํ˜•(type)์„ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

class GoogleLogin implements Login {
	@Override void login() {}
}

public void main(String[] args) {
    GoogleLogin gl = new GoogleLogin();
    Login l = new GoogleLogin();
}

๊ฐ™์€ ์ธ์Šคํ„ด์Šค(new GoogleLogin())๋”๋ผ๋„ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํ˜•์œผ๋กœ ํ‘œํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๊ตฌ์ฒด ํด๋ž˜์Šค์˜ ์ถ”์ƒ ํด๋ž˜์Šค๋กœ ํ‘œํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

๐Ÿค” ๋‹คํ˜•์„ฑ์ด ํ•„์š”ํ•œ ์ด์œ  (์˜ˆ์ œ)

abstract class Login {
    public abstract void login();
}

class GoogleLogin extends Login {
    @Override
    public void login() {
        System.out.println("Google ๋กœ๊ทธ์ธ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.");
    }
}

class AppleLogin extends Login {
    @Override
    public void login() {
        System.out.println("Apple ๋กœ๊ทธ์ธ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.");
    }
}

public static void main(String[] args) {
    Login googleLogin = new GoogleLogin();
    Login appleLogin = new AppleLogin();

    performLogin(googleLogin); // Google ๋กœ๊ทธ์ธ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    performLogin(appleLogin); // Apple ๋กœ๊ทธ์ธ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
}

public static void performLogin(Login login) {
    login.login();
}

performLogin() ๋ฉ”์„œ๋“œ๋Š” ๋กœ๊ทธ์ธ ๋ฐฉ์‹์— ์ƒ๊ด€์—†์ด ๋ชจ๋“  ๋กœ๊ทธ์ธ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

performLogin(googleLogin)์„ ํ˜ธ์ถœํ•˜๋ฉด Google ๋กœ๊ทธ์ธ์„ ์ˆ˜ํ–‰ํ•˜๊ณ , performLogin(appleLogin)์„ ํ˜ธ์ถœํ•˜๋ฉด Apple ๋กœ๊ทธ์ธ์„ ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์„ ์ผ๊ด€๋˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

โœ… ์ •๋ฆฌ

interface Login {
    void login();
}

interface Portal {
    void portal();
}

class Google implements Login, Portal {
    @Override
    public void login() {
    }

    @Override
    public void portal() {

    }
    
    public void onlyGoogle() {}
}

public void main(String[] args) {
    Login googleLogin = new Google();
    googleLogin.login();
    
    Portal googlePortal = new Google();
    googlePortal.portal();
}

googleLogin๊ณผ googlePortal์€ ๊ฐ™์€ Google์ด๋ผ๋Š” ๊ฐ์ฒด์ง€๋งŒ, ๋ˆ„๊ฐ€ ์ ‘๊ทผํ•˜๋ƒ์— ๋”ฐ๋ผ ํ•„ํ„ฐ๋ง๋œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

์ฆ‰, Loginํ˜•์ธ googleLogin์€ Login์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๊ฐ€์ง€๋Š” login๋ฉ”์„œ๋“œ์—๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๊ณ  Portalํ˜•์ธ googlePortal์€ Portal์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๊ฐ€์ง€๋Š” portal๋ฉ”์„œ๋“œ์—๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. 

 

์ด๋“ค์˜ ๊ด€๊ณ„๋ฅผ ์ด๋ฏธ์ง€๋กœ ์‚ดํŽด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์ถ”์ƒํ™”๋‹คํ˜•์„ฑ์„ ํ†ตํ•ด Googleํด๋ž˜์Šค์˜ login๋ฉ”์„œ๋“œ๋Š” Loginํ˜•๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๊ณ , portal๋ฉ”์„œ๋“œ๋Š” Portalํ˜•๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๊ณ , onlyGoogle๋ฉ”์„œ๋“œ๋Š” Googleํ˜•๋งŒ์ด ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜์—ฌ ์บก์Аํ™”๋ฅผ ์ง€์ผฐ๋‹ค.

 

๊ฐ์ฒด ๊ฐ„์˜ ํ˜‘๋ ฅ ๊ด€๊ณ„์—์„œ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉ๋˜์ง€๋งŒ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ์ด๋‹ค.


3. UML

 

UML์€ "Unified Modeling Language"์˜ ์•ฝ์ž

์†Œํ”„ํŠธ์›จ์–ด ์‹œ์Šคํ…œ์„ ์‹œ๊ฐ์ ์œผ๋กœ ๋ชจ๋ธ๋งํ•˜๊ณ  ์„ค๊ณ„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ํ‘œ์ค€ํ™”๋œ ๊ทธ๋ž˜ํ”ฝ ์–ธ์–ด์ด๋‹ค.

UML์€ ๊ฐ์ฒด ์ง€ํ–ฅ ๊ฐœ๋…์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ, ์‹œ์Šคํ…œ์˜ ๊ตฌ์กฐ, ๋™์ž‘, ์ƒํ˜ธ์ž‘์šฉ, ํ–‰์œ„ ๋“ฑ์„ ๋‹ค์–‘ํ•œ ๋‹ค์ด์–ด๊ทธ๋žจ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ: ๊ธฐ๋Šฅ์„ ๊ฐ์ฒด์—๊ฒŒ ๋‚˜๋ˆ ์„œ ์ˆ˜ํ–‰์‹œํ‚จ๋‹ค.
=> ๊ฐ์ฒด๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌ๋ถ„ํ–ˆ๋‹ค.
=> ๊ฐ์ฒด๊ฐ„์˜ ์—ฐ๊ด€๊ด€๊ณ„๊ฐ€ ์–ด๋– ํ•˜๋‹ค.

 

์ด๋Ÿฌํ•œ ์„ค๊ณ„๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ: UML

- Usecase Diagram

- Sequence Diagram

- Package Diagram

- Class Diagram

 

Tool ์‚ฌ์ดํŠธ: https://app.diagrams.net/https://staruml.io/

 

https://makerj.tistory.com/272

 

Generalization (์ผ๋ฐ˜ํ™”)

 

์ƒ์† ๋˜๋Š” ํ™•์žฅ ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ํ•œ ํด๋ž˜์Šค๊ฐ€ ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ํŠน์„ฑ๊ณผ ๋™์ž‘์„ ์ƒ์†๋ฐ›๋Š” ๊ด€๊ณ„์ด๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ "is-a" ๊ด€๊ณ„๋กœ ํ‘œํ˜„๋‹ค.

ํ˜•ํƒœ: B -โ–ทA

A๊ฐ€ ์ถ”์ƒ์ฒด, B๊ฐ€ ๊ตฌํ˜„์ฒด
B๊ฐ€ A๋ฅผ ์ƒ์†ํ–ˆ๋‹ค. (extends)
A๊ฐ€ B์˜ ์ผ๋ฐ˜ํ™” ํ˜•ํƒœ์ด๋‹ค. (์ถ”์ƒํ™”)
Realization (์‹ค์ฒดํ™”)

 

ํด๋ž˜์Šค๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ด€๊ณ„

ํด๋ž˜์Šค๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.

ํ˜•ํƒœ: B --โ–ทA

B๊ฐ€ A๋ฅผ implements ํ•œ๋‹ค

 

Dependency (์˜์กด)

 

ํ•œ ํด๋ž˜์Šค๊ฐ€ ๋‹ค๋ฅธ ํด๋ž˜์Šค์— ์˜์กดํ•˜๋Š” ๊ด€๊ณ„

ํ•œ ํด๋ž˜์Šค๊ฐ€ ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ํ•ด๋‹น ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์˜์กด ๊ด€๊ณ„๊ฐ€ ํ˜•์„ฑ๋œ๋‹ค.

ํ˜•ํƒœ: A --> B

A๊ฐ€ B๋ฅผ ์˜์กดํ•œ๋‹ค.
A๊ฐ€ ๋™์ž‘ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” B๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

 

Association (์—ฐ๊ด€)

ํด๋ž˜์Šค ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ด€๊ณ„

ํ•œ ํด๋ž˜์Šค๊ฐ€ ๋‹ค๋ฅธ ํด๋ž˜์Šค์™€ ๊ด€๋ จ์ด ์žˆ์Œ์„ ํ‘œํ˜„ํ•œ๋‹ค.

 

Directed Association (์ง์ ‘ ์—ฐ๊ด€)

 

์—ฐ๊ด€ ๊ด€๊ณ„์—์„œ ํ•œ ํด๋ž˜์Šค๊ฐ€ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฐฉํ–ฅ์„ฑ์„ ๋ช…์‹œํ•˜๋Š” ๊ด€๊ณ„

์ผ๋ฐฉํ–ฅ ๋˜๋Š” ์–‘๋ฐฉํ–ฅ์œผ๋กœ ํ‘œํ˜„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜•ํƒœ: A -> B

A๊ฐ€ B๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
์ฃผ์ฒด: A. ๋Œ€์ƒ:B

 

Aggregation (์ง‘ํ•ฉ, ์ง‘ํ•ฉ์—ฐ๊ด€)

 

์ „์ฒด์™€ ๋ถ€๋ถ„ ๊ฐ„์˜ ๊ด€๊ณ„

ํ•œ ํด๋ž˜์Šค๊ฐ€ ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ์ง‘ํ•ฉ์„ ํฌํ•จํ•˜๋Š” ๊ฒฝ์šฐ ์ง‘ํ•ฉ ๊ด€๊ณ„๊ฐ€ ํ˜•์„ฑ๋œ๋‹ค.

์ง‘ํ•ฉ ๊ด€๊ณ„์—์„œ๋Š” ์ „์ฒด ๊ฐ์ฒด๊ฐ€ ๋ถ€๋ถ„ ๊ฐ์ฒด๋“ค์— ๋Œ€ํ•œ ์†Œ์œ ๋‚˜ ์ฑ…์ž„์„ ๊ฐ–์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ˜•ํƒœ: A โ—‡- B, A โ—‡-> B

B๊ฐ€ ์—†์–ด๋„ A ์Šค์Šค๋กœ ์กด์žฌ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

Composition (ํ•ฉ์„ฑ, ๋ณตํ•ฉ์—ฐ๊ด€)

 

์ „์ฒด์™€ ๋ถ€๋ถ„ ๊ฐ„์˜ ๊ฐ•ํ•œ ๊ด€๊ณ„

ํ•œ ํด๋ž˜์Šค๊ฐ€ ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ๊ตฌ์„ฑ ์š”์†Œ๋กœ์„œ ์กด์žฌํ•˜๋ฉฐ, ์ „์ฒด ๊ฐ์ฒด๊ฐ€ ๋ถ€๋ถ„ ๊ฐ์ฒด๋“ค์„ ์†Œ์œ ํ•˜๊ฑฐ๋‚˜ ์ฑ…์ž„์ง€๋Š” ๊ด€๊ณ„์ž…๋‹ˆ๋‹ค.

ํ˜•ํƒœ: A โ—†- B, A โ—†-> B

B๊ฐ€ ์—†์œผ๋ฉด A๊ฐ€ ์กด์žฌํ•  ์ˆ˜ ์—†๋‹ค.

 

โœ… ์ •๋ฆฌ

๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋žจ์„ ์„ค๊ณ„๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๊ฒƒ

- ๊ฐ์ฒด๋ฅผ ๋ฌด์—‡์œผ๋กœ ๋งŒ๋“ค์—ˆ๋Š”์ง€ (ํ•„๋“œ, ๋ฉ”์„œ๋“œ)

- ๊ฐ์ฒด๋“ค ์‚ฌ์ด์˜ ๊ด€๊ณ„๋Š” ์–ด๋– ํ•œ์ง€


4. ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„

 

๐Ÿค” ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ๊ฐ์ฒด์ง€ํ–ฅ์„ ์ž˜ํ•  ์ˆ˜ ์žˆ์„๊นŒ?

=> ๊ฐ์ฒด๋ฅผ ์ž˜ ๋‚˜๋ˆ„๊ณ  ์—ฐ๊ด€ ์ง€์„ ์ˆ˜ ์žˆ๋А๋ƒ?

 

๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„๋ฅผ ํ•˜๋Š” 5๊ฐ€์ง€ ์›์น™

 

- S: SRP(Single Responsibility Principle) ๋‹จ์ผ ์ฑ…์ž„ ์›์น™, ๊ฐ์ฒด๊ฐ€ ์ˆ˜์ •๋˜๋Š” ๊ฒฝ์šฐ ์ˆ˜์ •๋˜๋Š” ์ด์œ ๋Š” ํ•˜๋‚˜ ๋•Œ๋ฌธ์ด์–ด์•ผ ํ•œ๋‹ค.

- O: OCP(Open-Closed Principle), ์ˆ˜์ •์—๋Š” ๋‹ซํžˆ๊ณ , ํ™•์žฅ์—๋Š” ์—ด์–ด๋ผ.

- L: LSP(Liskov Substitution Principle), ์ถ”์ƒ๊ฐ์ฒด๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ถ€๋ถ„์— ๊ตฌ์ƒ๊ฐ์ฒด๊ฐ€ ๋“ค์–ด๊ฐ€๋„ ์•„๋ฌด ๋ฌธ์ œ์—†์–ด์•ผ ํ•œ๋‹ค.

- I: ISP(Interface Segregation Principle) ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™, ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•˜์ง€ ์•Š๋„๋ก ๋ถ„๋ฆฌํ•˜๋ผ.

- D: DIP(Dependency Inversion Principle) ์˜์กด์„ฑ ์—ญ์ „ ์›์น™

 

์›์น™์— ๋”ฐ๋ผ์„œ ์„ค๊ณ„๋ฅผ ํ•ด๋ดค๋”๋‹ˆ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๊ฒฝ์šฐ์—์„œ ๊ณตํ†ต์ ์ด ๋ณด์˜€๋‹ค.

=> 23๊ฐ€์ง€์˜ ๋””์ž์ธ ํŒจํ„ด 

์ฐธ๊ณ : https://refactoring.guru/design-patterns/catalog

 

 

Reference
UML: ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ๊ณผ ์†Œ์Šค์ฝ”๋“œ ๋งคํ•‘

'๐Ÿ•Š๏ธ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฐ๋ธŒ์ฝ”์Šค' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

SpringBoot Part1-5  (0) 2023.06.26
SpringBoot Part1-4  (0) 2023.06.23
SpringBoot Part1-3  (0) 2023.06.22
SpringBoot Part1-2  (0) 2023.06.21
SpringBoot Part 1-1  (0) 2023.06.21

๋Œ“๊ธ€