πΎ [CS] κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°(Object-Oriented Programming, OOP)λ 무μμΌκΉμ?
- κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°(Object-Oriented Programming, OOP)μ νλ‘κ·Έλ¨μ κ°μ²΄(Object)λ₯Ό μ€μ¬μΌλ‘ ꡬμ±νλ νλ‘κ·Έλλ° ν¨λ¬λ€μμ λλ€.
- κ°μ²΄(Object)λ λ°μ΄ν°μ μ΄ λ°μ΄ν°λ₯Ό μ²λ¦¬νλ ν¨μλ₯Ό λ¬Άμ κ°λ μΌλ‘, νμ€ μΈκ³μ μ¬λ¬Όμ νλ‘κ·Έλ¨ λ΄μμ λͺ¨λ°©νμ¬ μ€κ³νλ λ°©μμ λλ€.
- κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°(Object-Oriented Programming, OOP)μ ν΅μ¬ κ°λ μ λ€μκ³Ό κ°μ΅λλ€.
πββοΈ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μμμ κ°μ²΄(Object)λ 무μμΌκΉμ?
1οΈβ£ ν΄λμ€μ κ°μ²΄.
π ν΄λμ€(Class).
- κ°μ²΄(Object)λ₯Ό μμ±νκΈ° μν μ²μ¬μ§μ΄λ νμ
λλ€.
- ν΄λμ€λ μμ±(λ°μ΄ν°)κ³Ό λ©μλ(ν¨μ)λ₯Ό μ μν©λλ€.
π κ°μ²΄(Object).
- ν΄λμ€(Class)λ₯Ό κΈ°λ°μΌλ‘ μμ±λ μ€μ²΄λ‘, ν΄λμ€μ μ μλ μμ±κ³Ό λ©μλλ₯Ό μ¬μ©ν©λλ€.
- κ°μ²΄λ ν΄λμ€μ μΈμ€ν΄μ€λΌκ³ λ λΆλ¦½λλ€.
π μμ.
// ν΄λμ€ μ μ
class Car {
// μμ± (νλ)
String model;
String color;
// μμ±μ
public Car(String model, String color) {
this.model = model;
this.color = color;
}
// λ©μλ
public void drive() {
System.out.println(model + "μ΄(κ°) λ¬λ¦½λλ€.");
}
}
// κ°μ²΄ μμ± λ° μ¬μ©
public class Main {
public static void main(String[] args) {
// Car ν΄λμ€μ μΈμ€ν΄μ€(κ°μ²΄) μμ±.
Car car1 = new Car("Volvo xc60", "Black");
car1.drive(); // μΆλ ₯: Volvo xc60μ΄(κ°) λ¬λ¦½λλ€.
}
}
- μ μμλ CarλΌλ ν΄λμ€λ₯Ό μ μνκ³ , κ·Έ ν΄λμ€λ₯Ό κΈ°λ°μΌλ‘ Volvo xc60μ΄λΌλ κ°μ²΄λ₯Ό μμ±ν ν
drive()
λ©μλλ₯Ό νΈμΆνλ κ³Όμ μ λλ€.
2οΈβ£ μΊ‘μν(Encapsulation)
- κ°μ²΄ λ΄λΆμ λ°μ΄ν°(μμ±)μ μ΄ λ°μ΄ν°λ₯Ό μ‘°μνλ λ©μλλ₯Ό νλλ‘ λ¬Άλ κ²μ λ§ν©λλ€.
- μΊ‘μν(Encapsulation)λ₯Ό ν΅ν΄ κ°μ²΄(Object) μΈλΆμμλ λ΄λΆ ꡬνμ μμ§ λͺ»νκ² νκ³ , μ 곡λ λ©μλλ₯Ό ν΅ν΄μλ§ λ°μ΄ν°λ₯Ό μ κ·Όνκ±°λ λ³κ²½ν μ μκ² λ§λλλ€.
- μ΄λ₯Ό ν΅ν΄ λ°μ΄ν° 보νΈμ μ½λμ μμ§μ±μ λμΌ μ μμ΅λλ€.
π μμ
class Person {
// private μμ± (μΈλΆμμ μ§μ μ κ·Όν μ μμ)
private String name;
private int age;
// μμ±μ
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// public λ©μλλ₯Ό ν΅ν΄ κ°μ μ μΌλ‘ μ κ·Ό
public String getName() {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if(age > 0) { // μ ν¨μ± κ²μ¬
this.age = age;
}
}
}
public class Main {
public static void main(String[] args) {
Person p = new Person("Kobe", 25);
System.out.println(p.getName()); // μΆλ ₯: Kobe
p.setAge(30);
System.out.println(p.getAge()); // μΆλ ₯: 30
}
}
- μ΄ μμμμλ Person ν΄λμ€μμ μΊ‘μν(Encapsulation)κ° μ μ©λμ΄,
name
κ³Όage
κ°μ μμ±μprivate
μΌλ‘ μ μΈλμ΄ μΈλΆμμ μ§μ μ κ·Όν μ μμΌλ©°, μ΄λ₯Ό μ‘°μνκΈ° μν΄μλ μ 곡λ λ©μλ(getName()
,setAge()
)λ₯Ό ν΅ν΄ κ°μ μ μΌλ‘ μ κ·Όνκ² λ©λλ€.
3οΈβ£ μμ(Inheritance)
- μμ(Inheritance)μ κΈ°μ‘΄ ν΄λμ€λ₯Ό νμ₯νμ¬ μλ‘μ΄ ν΄λμ€λ₯Ό λ§λλ λ°©λ²μ
λλ€.
- μμ ν΄λμ€λ λΆλͺ¨ ν΄λμ€μ μμ±κ³Ό 맀μλλ₯Ό λ¬Όλ €λ°μ μ¬μ¬μ©νλ©°, νμνλ©΄ μΆκ°λ‘ κΈ°λ₯μ νμ₯νκ±°λ μμ ν μ μμ΅λλ€.
- μμ(Inheritance)μ ν΅ν΄ μ½λμ μ¬μ¬μ©μ±μ λμ΄κ³ , κ³μΈ΅ ꡬ쑰λ₯Ό λ§λ€ μ μμ΅λλ€.
π μμ
// λΆλͺ¨ ν΄λμ€.
class Animal {
String name;
public Animal(String name) {
this.name = name;
}
public void makeSound() {
System.out.println("λλ¬Όμ΄ μ리λ₯Ό λ
λλ€.")
}
}
// μμ ν΄λμ€ (μμ)
class Dog extends Animal {
public Dog(String name) {
super(name); // λΆλͺ¨ ν΄λμ€μ μμ±μλ₯Ό νΈμΆ
}
// λΆλͺ¨ λ©μλ μ€λ²λΌμ΄λ©
@Override
public void makeSound() {
System.out.println(name + "μ΄(κ°) λ©λ© μ§μ΅λλ€.");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog("λλ₯΄");
dog.makeSound(); // μΆλ ₯: λλ₯΄μ΄(κ°) λ©λ© μ§μ΅λλ€.
}
}
- μ μμμμ, Dog ν΄λμ€(Class)λ Animal ν΄λμ€(Class)λ₯Ό μμλ°μ makeSound() λ©μλλ₯Ό μ¬μ μ(Overriding, μ€λ²λΌμ΄λ©)νκ³ , μ΄λ¦μ μΆλ ₯νλλ‘ νμ₯νμ΅λλ€.
- μμ(Inheritance)μ ν΅ν΄ λΆλͺ¨ ν΄λμ€μ κΈ°λ₯μ μ¬μ¬μ©νλ©΄μλ νμμ λ°λΌ μΆκ°μ μΈ κΈ°λ₯μ ꡬνν μ μμ΅λλ€.
4οΈβ£ λ€νμ±(Polymorphism)
-
λ€νμ±(Polymorphism)μ κ°μ μ΄λ¦μ λ©μλκ° λ€μν λ°©λ²μΌλ‘ λμν μ μκ² νλ κΈ°λ₯μ
λλ€.
- μμ(Inheritance) κ΄κ³μμ λΆλͺ¨ ν΄λμ€(Parents class, Super class)μ λ©μλ(Methods)λ₯Ό μμ ν΄λμ€(Child class, Sub class)μμ μ¬μ μ(μ€λ²λΌμ΄λ©, Overriding)νμ¬ λ€λ₯Έ λ°©μμΌλ‘ λμνκ² νκ±°λ, κ°μ μ΄λ¦μ λ©μλκ° μλ‘ λ€λ₯Έ 맀κ°λ³μ(Paremeter)μ λ°λΌ λ€λ₯΄κ² λμ(μ€λ²λ‘λ©, Overloading)ν μ μμ΅λλ€.
- λ€νμ±(Polymorphism)μ ν΅ν΄ μ½λμ μ μ°μ±κ³Ό νμ₯μ±μ λμΌ μ μμ΅λλ€.
π μμ.
class Animal {
public void makeSound() {
System.out.println("λλ¬Όμ΄ μ리λ₯Ό λ
λλ€.");
}
}
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("λ©λ©");
}
}
class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("μΌμΉ");
}
}
public class Main {
public static void main(String[] args) {
Animal animal1 = new Dog();
Animal animal2 = new Cat();
animal1.makeSound(); // μΆλ ₯: λ©λ©
animal2.makeSount(); // μΆλ ₯: μΌμΉ
}
}
- μ΄ μμλ λ€νμ±(Polymorphism)μ 보μ¬μ£Όλ μ’μ μμ
λλ€.
-
Animal
νμ μ λ³μμ Dogμ Cat κ°μ²΄λ₯Ό ν λΉν μ μμΌλ©°,makeSound()
λ©μλλ₯Ό νΈμΆνλ©΄ κ°μ²΄μ νμ μ λ§κ² λ€λ₯΄κ² λμν©λλ€.- μ΄μ²λΌ λΆλͺ¨ ν΄λμ€ νμ μΌλ‘ λ€μν μμ κ°μ²΄λ₯Ό μ²λ¦¬ν μ μμ΅λλ€.
-
5οΈβ£ μΆμν(Abstraction)
- μΆμν(Abstraction)μ 볡μ‘ν νμ€μ κ°μ²΄μμ νμν λΆλΆλ§μ λͺ¨λΈλ§νμ¬ κ°μ²΄λ‘ νννλ κ³Όμ μ
λλ€.
- λΆνμν μΈλΆ μ¬νμ μ¨κΈ°κ³ μ€μν λΆλΆλ§ λλ¬λ΄μ΄ ν¨μ¨μ μΌλ‘ λ¬Έμ λ₯Ό ν΄κ²°νλ λ° λμμ μ€λλ€.
- μΆμν(Abstraction)λ μΈν°νμ΄μ€(Interface)λ μΆμ ν΄λμ€λ₯Ό ν΅ν΄ ꡬνλ©λλ€.
π μμ.
// μΆμ ν΄λμ€
abstract class Vehicle {
String model;
public Vehicle(String model) {
this.model = model;
}
// μΆμ λ©μλ (ꡬ체μ μΈ κ΅¬νμ νμ ν΄λμ€μμ)
public abstract void move();
}
// μμ ν΄λμ€ (ꡬ체μ μΈ κ΅¬ν μ 곡)
class Car extends Vehicle {
public Car(String model) {
super(model);
}
@Override
public void move() {
System.out.println(model + "μ΄(κ°) λλ‘μμ λ¬λ¦½λλ€.");
}
}
class Airplane extends Vehicle {
public Airplane(String model) {
super(model);
}
@Override
public void move() {
System.out.println(model + "μ΄(κ°) νλμ λ©λλ€.");
}
}
public class Main {
public static void main(String[] args) {
Vehicle car = new Car("Volvo xc60");
Vehicle airplane = new Airplane("Boeing 747");
car.move(); // μΆλ ₯: Volvo xc60μ΄(κ°) λλ‘μμ λ¬λ¦½λλ€.
airplane.move(); // μΆλ ₯: Boeing 747μ΄(κ°) νλμ λ©λλ€.
}
}
- μ μμμμλ μΆμ ν΄λμ€(Abstract class)λ₯Ό ν΅ν΄μ μΆμν(Abstraction)λ₯Ό 보μ¬μ€λλ€.
-
Vehicle ν΄λμ€λ μΆμ ν΄λμ€(Abstract class)μ΄λ©°, μμ ν΄λμ€μΈ Car μ Airplaneμ΄ κ΅¬μ²΄μ μΈ κ΅¬νμ μ 곡ν©λλ€.
- μΆμν(Abstraction)λ₯Ό ν΅ν΄ 곡ν΅μ μΈ λμμ μ μνλ©΄μλ κ° κ°μ²΄κ° κ°λ³μ μΈ λμμ ꡬνν μ μμ΅λλ€.
-
Vehicle ν΄λμ€λ μΆμ ν΄λμ€(Abstract class)μ΄λ©°, μμ ν΄λμ€μΈ Car μ Airplaneμ΄ κ΅¬μ²΄μ μΈ κ΅¬νμ μ 곡ν©λλ€.
6οΈβ£ κ°λ¬΄λ¦¬.
- μ΄λ¬ν κ°λ μ λ°νμΌλ‘ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°(Object-Oriented Programming, OOP)μ μ½λμ μ¬μ¬μ©μ±μ λμ΄κ³ , μ μ§λ³΄μμ νμ₯μ±μ κ°μ νλ©°, νμ€ μΈκ³μ λ¬Έμ λ₯Ό λ μ§κ΄μ μΌλ‘ ν΄κ²°ν μ μλλ‘ ν©λλ€.