ํด๋์ค๋ ๊ฐ์ฒด์งํฅํ๋ก๊ทธ๋๋ฐ(OOP: Object-Oriented Programming)์์ ๊ฐ์ฒด๋ฅผ ์ ์ํ๋ ํ ๋๋ ์ค๊ณ๋์ ๊ฐ์ ์๋ฏธ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
๐ ๊ทธ๋ ๋ค๋ฉด ๊ฐ์ฒด์งํฅํ๋ก๊ทธ๋๋ฐ์ ๋ฌด์์ผ๊น์?
๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์ปดํจํฐ ํ๋ก๊ทธ๋จ์ ๋ช ๋ น์ด์ ๋ชฉ๋ก์ผ๋ก ๋ณด๋ ์๊ฐ์์ ๋ฒ์ด๋ ์ค์ํ์์ ์ฐ๋ฆฌ๊ฐ ์ธ์ํ ์ ์๋ ์ฌ๋ฌผ๊ณผ ๊ฐ์ ์ฌ๋ฌ ๊ฐ์ ๋ ๋ฆฝ๋ ๋จ์, ์ฆ "๊ฐ์ฒด(object)"๋ค์ ๋ชจ์์ผ๋ก ํ์ ํ๊ณ ์ ํ๋ ์ปดํจํฐ ํ๋ก๊ทธ๋๋ฐ์ ํจ๋ฌ๋ค์ ์ค ํ๋์ ๋๋ค.
๋ฐ๋ผ์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์์๋ ์ด๋ฌํ ๊ฐ์ฒด์ ์ํ(state)์ ํ๋(behavior)์ ๊ตฌ์ฒดํํ๋ ํํ์ ํ๋ก๊ทธ๋๋ฐ์ ํ๊ณ , ์ด๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ๋ด๊ธฐ ์ํ ์ค๊ณ๋์ ๊ฐ์ ๊ฐ๋ ์ ํด๋์ค(class)๋ผ๊ณ ํฉ๋๋ค.
ํด๋์ค๋ ๊ฐ์ฒด์ ์ํ๋ฅผ ๋ํ๋ด๋ ํ๋(field)์ ๊ฐ์ฒด์ ํ๋์ ๋ํ๋ด๋ ๋ฉ์๋(method)๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. field๋ ํด๋์ค์ ํฌํจ๋ ๋ณ์(variable)๋ฅผ ์๋ฏธํ๊ณ , method๋ ์ด๋ ํ ํน์ ์์ ์ ์ํํ๊ธฐ ์ํ ๋ช ๋ น๋ฌธ์ ์งํฉ์ด๋ผ ํ ์ ์์ต๋๋ค.
ํด๋์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์ฐ์ ํด๋น ํด๋์ค ํ์ ์ ๊ฐ์ฒด(object)๋ฅผ ์ ์ธํด์ผ ํฉ๋๋ค. ์ด๋ ๊ฒ ํด๋์ค๋ก๋ถํฐ ๊ฐ์ฒด๋ฅผ ์ ์ธํ๋ ๊ณผ์ ์ ํด๋์ค์ ์ธ์คํด์คํ๋ผ๊ณ ํฉ๋๋ค.
๋ํ, ์ด๋ ๊ฒ ์ ์ธ๋ ํด๋น ํด๋์ค ํ์
์ ๊ฐ์ฒด๋ฅผ ์ธ์คํด์ค(instance)
๋ผ๊ณ ํฉ๋๋ค. (์ฆ, ์ธ์คํด์ค๋ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๋ ๊ฐ์ฒด๋ฅผ ์๋ฏธํฉ๋๋ค.)
์ธ์คํด์ค๋ ํ๋์ ํด๋์ค๋ก๋ถํฐ ์ฌ๋ฌ ๊ฐ ์์ฑ๋ ์ ์๊ณ , ์์ฑ๋ ์ธ์คํด์ค๋ ๋ ๋ฆฝ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ ์ฅ๋ ์์ ๋ง์ ํ๋๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. ํ์ง๋ง ํด๋น ํด๋์ค์ ๋ชจ๋ ๋ฉ์๋(method)๋ ํด๋น ํด๋์ค์์ ์์ฑ๋ ๋ชจ๋ ์ธ์คํด์ค๊ฐ ๊ณต์ ํ๊ฒ ๋ฉ๋๋ค.
(+ Animal์ด๋ผ๋ ํด๋์ค๊ฐ ์๋ค๋ฉด 'dog๋ ๊ฐ์ฒด', 'dog์ Animal์ instance'๊ฐ ๋ง๋ ํํ)
์์ ํด๋์ค์์ ์ธ๊ธํ๋ฏ์ด, ํด๋์ค์์๋ ๋ฉ์๋(method)๋ฅผ ํตํด ๊ฐ์ฒด์ ํ๋์ ๊ตฌ์ฒดํ ํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์๋ฉ์๋
๋ ์ด๋ ํ ํน์ ์์
์ ์ํํ๊ธฐ ์ํ ๋ช
๋ น๋ฌธ์ ์งํฉ์ด๋ผ ํ ์ ์์ต๋๋ค.
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํจ์ผ๋ก์จ ์ค๋ณต๋๋ ์ฝ๋๋ก ์ธํ ๋ฐ๋ณต์ ์ธ ํ๋ก๊ทธ๋๋ฐ์ ํผํ ์ ์๊ฒ ๋ฉ๋๋ค. ๋ํ, ๋ชจ๋ํ๋ก ์ธํด ์ ์ฒด์ ์ธ ์ฝ๋์ ๊ฐ๋ ์ฑ์ ๋์ผ ์ ์๊ณ , ์ ์ง๋ณด์ ์ธก๋ฉด์์๋ ํ๋ก๊ทธ๋จ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฑฐ๋ ๊ธฐ๋ฅ์ ๋ณ๊ฒฝ์ด ํ์ํ ๋ ๋์ฑ ํจ์จ์ ์ผ๋ก ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
(+ ๋ฉ์๋๋ฅผ ์์ฑํ ๋๋ ๋๋๋ก ํ๋์ ๋ฉ์๋๊ฐ ํ๋์ ๊ธฐ๋ฅ๋ง์ ์ํํ๋๋ก ์์ฑํ๋ ๊ฒ์ด ์ข์ต๋๋ค.)
์์ฑ์(constructor)
๋ ํด๋น ํด๋์ค์ ๊ฐ์ฒด๊ฐ ์ธ์คํด์คํ๋ ๋ ์๋์ผ๋ก ํธ์ถ๋์ด ์์ฑ๋ ๊ฐ์ฒด์ ํ๋๋ฅผ ์ด๊ธฐํ ํด์ฃผ๋ ํน๋ณํ ํ์
์ ๋ฉ์๋์
๋๋ค. ๋ฐ๋ผ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ๋ฐ๋์ ํธ์ถ๋๊ณ ์ ์ผ ๋จผ์ ์คํ๋ฉ๋๋ค.
์ด๋ฌํ ์์ฑ์๋ ์ผ์ข ์ ๋ฉ์๋์ ์ ์ฌํ์ง๋ง, ๋ช ๋ฐฑํ ๋ฆฌํด ํ์ ์ด ์๊ณ ๋ฉ์๋์๋ ๋ค๋ฅธ ๊ท์น๋ค์ ๊ฐ์ง๊ธฐ ๋๋ฌธ์ ์ ํํ ๋ฉ์๋๋ ์๋๋๋ค.
์ธํฐํ์ด์ค๋ ์ด๋ค ๊ฐ์ฒด์ ๋ํ ๋ช ์ ๋ก ์ด ๊ฐ์ฒด๊ฐ ์ด๋ค ๋ฉ์๋๋ค์ ์ ๊ณตํ๊ณ ์ด๋ ์ญํ ์ ํ๋์ง์ ๋ํ ์ผ์ข ์ ์ค๋ช ์๋ก ๋๋ถ๋ถ ์ค๊ณ๋จ๊ณ์์ ๋ง๋ค๊ฒ ๋ฉ๋๋ค.
์ธํฐํ์ด์ค๋ ์ค์ฒดํด๋์ค(๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํ ์ ์๋ ํด๋์ค)์ ๊ณตํต์ ์ธ ์์ฑ(ํ๋, ๋ฉ์๋)๋ง ๋ฝ์๋ด์ด ์ ์ธํ ํด๋์ค์ธ ์ถ์ํด๋์ค(abstract class)์ ๋น์ทํ ๊ฐ๋ ์ผ๋ก ์ดํดํ ์๋ ์์ต๋๋ค.
์ถ์ํด๋์ค์ ์ธํฐํ์ด์ค๋ ๋ชจ๋ ์ค์ค๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์๊ณ , ๊ตฌํ์ ๋ชฉ์ ์ผ๋ก ์์๊ด๊ณ์์๋ง ์กด์ฌํ๋ค๋ ๊ณตํต์ ์ด ์์ต๋๋ค. ๋ฐ๋ฉด, ์ฐจ์ด์ ์ ์ถ์ํด๋์ค๋ ์ถ์๋ฉ์๋์ ์ผ๋ฐ ๋ฉ์๋๊ฐ ๋์์ ์์ง๋ง ์ธํฐํ์ด์ค๋ ์ค๋ก์ง ์ ์ธ(declare)๋ง ๊ฐ๋ฅํ ์ถ์๋ฉ์๋๋ก๋ง ์ด๋ฃจ์ด์ ธ์๋ค๋ ๊ฒ์ด๊ณ , ๋ค์ค์์์ด ๊ฐ๋ฅํ ์ธํฐํ์ด์ค์๋ ๋ฌ๋ฆฌ ์ถ์ํด๋์ค๋ (์๋ฐ์์) ๋ค์ค์์ ๋ํ ๋ถ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ๋๋ค.
์ฆ, ์ถ์ํด๋์ค A,B๊ฐ ์์ ๋, ํด๋์ค C๋ A,B๋ฅผ ๋์์ ์์๋ฐ์ ์ ์์ต๋๋ค.
abstract class A {}
abstract class B {}
class C extends A, B --> (X)
๋ฐ๋ฉด A,B๊ฐ ์ธํฐํ์ด์ค์ธ ๊ฒฝ์ฐ
interface class A {}
interface class B {}
class C implements A, B --> (O)
๋ค์ค์์์ด ๊ฐ๋ฅํ๋ค๋ ์ ์ด์ธ์๋ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ฅ์ ์ด ์์ต๋๋ค.
๊ฐ์ฒด ์งํฅ์์ ์ ๋ณด ์๋(data hiding)์ด๋ ์ฌ์ฉ์๊ฐ ๊ตณ์ด ์ ํ์๊ฐ ์๋ ์ ๋ณด๋ ์ฌ์ฉ์๋ก๋ถํฐ ์จ๊ฒจ์ผ ํ๋ค๋ ๊ฐ๋ ์ ๋๋ค. ๊ทธ๋ ๊ฒ ํจ์ผ๋ก์จ ์ฌ์ฉ์๋ ์ธ์ ๋ ์ต์ํ์ ์ ๋ณด๋ง์ผ๋ก ํ๋ก๊ทธ๋จ์ ์์ฝ๊ฒ ์ฌ์ฉํ ์ ์๊ฒ ๋ฉ๋๋ค.
์๋ฐ์์๋ ์ด๋ฌํ ์ ๋ณด ์๋์ ์ํด ์ ๊ทผ ์ ์ด์(access modifier)๋ผ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ณ ์์ต๋๋ค.
์ ๊ทผ ์ ์ด์๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋์ค ์ธ๋ถ์์์ ์ง์ ์ ์ธ ์ ๊ทผ์ ํ์ฉํ์ง ์๋ ๋ฉค๋ฒ๋ฅผ ์ค์ ํ์ฌ ์ ๋ณด ์๋์ ๊ตฌ์ฒดํํ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก public ๋ฉค๋ฒ๋ ๋ชจ๋ ๊ฐ์ฒด์์ ์ ๊ทผํ ์ ์์ง๋ง, private ๋ฉค๋ฒ๋ ํด๋น ๊ฐ์ฒด ๋ด์ ๋ฉค๋ฒ ๋ณ์๋ ๋ฉ์๋๋ง์ด ์ ๊ทผํ ์ ์์ต๋๋ค.
์๋ฐ์์๋ ๋ค์๊ณผ ๊ฐ์ ๋ค ๊ฐ์ง์ ์ ๊ทผ ์ ์ด์๋ฅผ ์ ๊ณตํฉ๋๋ค.
1. public
Public
์ package, Class๊ฐ ๋์ผํ์ง ์์๋ ๋ชจ๋ ์ ๊ทผ์ด ๊ฐ๋ฅํ ์ ํ์์ด๋ค.2. protected
Protected
๋ ๊ฐ์ package์์๋ง ์ ๊ทผ์ ํ์ฉํ๊ณ ๋ค๋ฅธ package์์ ์ ๊ทผํ๋ ค๋ฉด ํด๋น Class๋ฅผ ์์๋ฐ์ ์์๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํ ์ ํ์์ด๋ค.3. default
default
๋ ๋์ผ package์์๋ง ์ ๊ทผ์ ํ์ฉํ๋ ์ ํ์๋ก, ์ ๊ทผ ์ ํ์๊ฐ ์๋ต๋์ด ์์๊ฒฝ์ฐ์ ๊ธฐ๋ณธ์ ์ผ๋ก default ์ ๊ทผ ์ ํ์๊ฐ ์ ์ฉ๋๋ค.4. protected
private
๋ ๋์ผ package, ๋ค๋ฅธ package ๋ชจ๋ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ๊ณ ๊ฐ์ Class ๋ด์์๋ง ์ ๊ทผ์ ํ์ฉํ๋ ์ ํ์์ด๋ค.๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์์ ์บก์ํ
๋ ๊ด๋ จ ์๋ ๋ฐ์ดํฐ(์์ฑ, ๋ณ์)์ ๋์(ํ์, ํจ์)๋ค์ ํ๋๋ก ๋ฌถ๊ณ , ์ฌ์ฉ์์๊ฒ๋ ์ผ๋ถ ๋ด๋ถ์ ์ธ ์ ๊ทผ์ ํ์ฉํ์ง ์์์ผ๋ก์จ ์ฌ์ฉ์ ํธ์์ฑ์ ์ ๊ณตํด ์ฃผ๋ ๊ฒ์
๋๋ค.
์บก์ํ๋ ๋ณดํต ๋ฐ์ดํฐ๋ค์ ๊ณต๊ฐํ์ง ์๊ณ ๋ช๊ฐ์ ๋ฉ์๋ ๋ง์ ์ธ๋ถ์ ๊ณต๊ฐํจ์ผ๋ก์จ ๊ตฌํํฉ๋๋ค.
๊ด์ฉ์ ์ธ ๊ฐ๋
์ ๋คํ์ฑ
์ด๋ ๊ฐ์ ๋ชจ์์ ์ฝ๋๊ฐ ๋ค๋ฅธ ํ์๋ฅผ ํ๋ ๊ฒ์ ๋ํ๋
๋๋ค.
์ด๋ฌํ ๊ฐ๋
์ ์ผ์์ํ ์ ํค๋ณด๋์์๋ ํ์ธํ ์ ์์ต๋๋ค. ์ซ์ํค [ 1 ]๊ณผ ์๋ฌธํค [ A ]๋ ์๋ก ๋น์ทํ ํค๋ณด๋ ๋ชจ์์ ๊ฐ์ก์ง๋ง '๋๋ฅธ๋ค'๋ ํ์๋ฅผ ํ์ ๋ [ 1 ]์ ์ซ์ 1์ ์ถ๋ ฅํ๊ณ , [ A ]๋ ๋ฌธ์ 'A'๋ฅผ ์ถ๋ ฅํ๋ ๋ค๋ฅธ ํ์๋ฅผ ํฉ๋๋ค.
ํ๋ก๊ทธ๋๋ฐ์์๋ ๋คํ์ฑ์ด๋ ํ๋์ ๋ฉ์๋๋ ํด๋์ค๊ฐ ์์ ๋ ์ด๊ฒ๋ค์ด ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ๋์ํ๋ ๊ฒ์ ๋ํ๋ด๊ณ , ์ค๋ฒ๋ผ์ด๋ฉ(overriding)๊ณผ ์ค๋ฒ๋ก๋ฉ(overloading) ๋ฑ์ ํตํด ๊ตฌํ๋ ์ ์๋ค.
์ค๋ฒ๋ผ์ด๋ฉ
์ ๋น์ทํ ๊ตฌ์กฐ๋ฅผ ๊ฐ๊ณ ์์ง๋ง ์ํ๋๋ ๋์์ด ๋ค๋ฅผ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
์๋ฅผ๋ค์ด, ๋๋ฌผ๋ค์ ๋ชจ๋ ๊ฐ์์ ์ธ์์๋ฆฌ๊ฐ ์๋ค๋ ํน์ง์ด ์์ง๋ง, ๊ณ ์์ด๋ '์ผ์น', ์ค๋ฆฌ๋ '๊ฝฅ๊ฝฅ'ํ๋ฉฐ ๊ฐ์ ๋ค๋ฅธ ์๋ฆฌ๋ฅผ ๋ ๋๋ค.
์ด๋ฅผ ๊ฐ๋จํ ์ฝ๋๋ก ํํํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
abstract class Animal {
/*...*/
abstract void bark();
}
class Cat extends Animal {
void bark(){
system.out.println("์ผ์น")
}
}
class Duck extends Animal {
void bark(){
system.out.println("๊ฝฅ๊ฝฅ")
}
}
์ด ๋ Cat๊ณผ Duck์ ์ถ์ ํด๋์ค์ธ Animal์ ์์ ๋ฐ์ bark๋ผ๋ ๊ฐ์ ํจ์์ ๊ฐ์ ๋ค๋ฅธ ์ธ์์๋ฆฌ๋ฅผ ๋ด๋ ๋ฉ์๋๋ฅผ ์ ์ํฉ๋๋ค.
์ฆ, ์ค๋ฒ๋ผ์ด๋ฉ์ ์ด๋ ๊ฒ barkํจ์์ ๊ฐ์ด ์ํผํด๋์ค๋ฅผ ์์๋ฐ์ ์๋ธํด๋์ค์์ ์ํผํด๋์ค์ (์ถ์) ๋ฉ์๋๋ฅผ ๊ฐ์ ์ด๋ฆ, ๊ฐ์ ๋ฐํ๊ฐ, ๊ฐ์ ์ธ์๋ก ๋ฉ์๋ ๋ด์ ๋ก์ง๋ค์ ์๋กญ๊ฒ ์ ์ํ๋ ๊ฒ์ ๋งํฉ๋๋ค.
์ค๋ฒ๋ก๋ฉ
์ ์ค๋ฒ๋ผ์ด๋ฉ๊ณผ๋ ๊ตฌ๋ถ๋๋ ๊ฐ๋
์ผ๋ก ํ๋์ ํด๋์ค์์ ๊ฐ์ ์ด๋ฆ์ ๋ฉ์๋๋ฅผ ์ฌ๋ฌ ๊ฐ ์ง์ ํ ์ ์๋ค๋ ๊ฐ๋
์
๋๋ค. ๋จ ์ค๋ฒ๋ก๋ฉ ๋ฉ์๋๋ค์ ์ปดํ์ผ๋ฌ๊ฐ ์ด๋ฅผ ๊ตฌ๋ถํ ์ ์๋๋ก ์ธ์์ ๊ฐ์๋ ํ์
์ด ๋ฌ๋ผ์ผ ํฉ๋๋ค!
ํด๋์ค์ ์์ฑ์ ๋ํ ์ค๋ฒ๋ก๋ฉ์ ํตํด ์ฌ๋ฌ ๊ฐ๋ก ์ ์ํ ์ ์์ต๋๋ค.
class Person {
Person(){
// ๋ํดํธ ์์ฑ์
}
Person(string name, int age) {
// ์์ฑ์ ์ด๋ฆ๊ณผ ๋์ด๋ฅผ ์
๋ ฅ ๋ฐ์
}
}
์บก์ํ(Encapsulation) ๋ ๋ฌด์์ธ๊ฐ?