OOP: Object Oriented Programming의 약자로, 객체지향 프로그래밍을 말한다.
컴퓨터 프로그래밍 패러다임 중 하나로, 여러 개의 독립된 단위인 객체들간의 상호작용을 통해서 프로그램을 만드는 방식이다.
- 코드의 재사용에 용이하다.
- 유지보수가 쉽다.
- 상대적으로 처리 속도가 느리다.
- 설계 시 많은 시간과 노력이 필요하다.
추상화: 객체의 관련 속성만 표시하고, 불필요한 정보는 숨겨서 인터페이스와 구현을 분리하는 것이다.
abstract class Animal{ String name; int legs; String howling; public void setAnimal(String name, int legs, String howling) { this.name = name; this.legs = legs; this.howling = howling; } public abstract void walk(); public abstract void talk(); public void run() { walk(); talk(); } } class Dog extends Animal { @Override public void walk() { System.out.println(this.name + "가 나타나 "+this.legs+"개의 다리로 걸어다닙니다."); } @Override public void talk() { System.out.println(this.name + "가 " + this.howling + " 소리 내며 울어댑니다."); } } class Cat extends Animal { @Override public void walk() { System.out.println(this.name + "가 나타나 "+this.legs+"개의 다리로 걸어다닙니다."); } @Override public void talk() { System.out.println(this.name + "가 " + this.howling + " 소리 내며 울어댑니다."); } } class Duck extends Animal { @Override public void walk() { System.out.println(this.name + "가 나타나 "+this.legs+"개의 다리로 걸어다닙니다."); } @Override public void talk() { System.out.println(this.name + "가 " + this.howling + " 소리 내며 울어댑니다."); } } public class Main { public static void main(String[] args) { Dog dog = new Dog(); dog.setAnimal("개", 4, "멍멍"); dog.run(); // Cat cat = new Cat(); cat.setAnimal("고양이", 4, "야옹"); cat.run(); // Duck duck = new Duck(); duck.setAnimal("오리", 2, "꽥꽥"); duck.run(); } }
이때 Dog, Cat, Duck 클래스에서 오버라이딩을 하지 않으면 부모 클래스와 비슷한 일을 함에도 계속 새로운 메소드를 만들어줘야 해서 비효율적이다.
캡슐화: 연관된 목적을 가지는 변수와 함수를 하나의 클래스로 묶어 외부에서 쉽게 접근하지 못하도록 은닉하는 것이다.
public class Person{ private String name; private int age; // public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } public class Main { /** * @param args the command line arguments */ public static void main(String[] args) { Person person = new Person(); person.setAge(17); person.setName("Tom"); System.out.println(person.getAge()); System.out.println(person.getName()); } }
상속화: 기존 클래스를 재사용하는 것으로 상위클래스를 하위클래스에서 물려받게 되면 상위클래스의 멤버변수나 메소드를 그대로 물려받아 사용할 수 있게 된다.
1번 추상화 예제에서 Dog, Cat, Duck 클래스가 Animal abstract 클래스를 상속받아 해당 클래스의 멤버변수와 메소드를 사용하는 것을 볼 수 있다.
ex) walk, talk 메소드 & name, howling, legs 멤버변수
다향화: 부모-자식 상속 관계에 있는 클래스에서 상위 클래스가 동일한 메시지로 하위 클래스들을 서로 다르게 동작시키는 객체 지향 원리이다. 다양화를 활용하면 부모 클래스가 자식 클래스의 동작 방식을 알 수 없어도 오버라이딩을 통해서 자식 클래스를 접근할 수 있다.
abstract class Animal { String name; int legs; String howling; Animal(String name, int legs, String howling) { this.name = name; this.legs = legs; this.howling = howling; } public abstract void walk(); public abstract void talk(); }
public class Dog extends Animal{ public Dog(String name, int legs, String howling) { super(name, legs, howling); } // 1. 오버라이딩 @Override public void walk() { System.out.println(this.name + "가 나타나 "+this.legs+"개의 다리로 걸어다닙니다."); } @Override public void talk() { System.out.println(this.name + "가 " + this.howling + " 소리 내며 울어댑니다."); } }
public class NewMain { /** * @param args the command line arguments */ public static void main(String[] args) { // 2. 업캐스팅(자식 클래스 객체를 부모 클래스로 형변환)하여 객체 선언 Animal a = new Dog("개", 4, "멍멍"); // 3.부모 클래스 객체로 자식 메소드 호출 a.walk(); } }
다양화의 예제로 1. 오버라이딩, 2 업캐스팅, 3 부모 클래스 객체로 자식 메소드 호출이 사용되었다.