객체지향언어의 큰 특징으로 4가지를 꼽을 수 있다.
갭슐화, 상속, 추상화, 다형성
상속, 추상화, 다형성은 서로 연관되어있는 기능이라고 생각하는 것이 편하다.
추상화는 interface와 같이 함수의 이름만을 정의해 놓은 상태를 이야기 한다.
이 함수가 앞으로 어떤 일을 할지는 다형성을 통하여 만들어 줄 수가 있다.
위의 그림과 같이 동물의 울음소리 라는 추상화가 존재한다면 세부항목으로 다양한 동물이 존재할 수 있다.(개, 고양이, 닭 등...) 각 동물들의 울음 소리는 다를 것이기 때문에 제각각 설정을 해주어야 한다. 코드로 설명하면 아래와 같다
interface Animal{
public String sound();
}
class Cat implements Animal{
public String sound(){
return "야옹";
};
}
class Dog implements Animal{
public String sound(){
return "멍멍";
};
}
이런 식으로 사용했을 때 장점은 sound라는 함수를 각 클래스에 맞게 재정의 할 수 있다는 것이다. 바로 이 재정의 과정이 다형성이다.
그럼 추상화와 다형성에 대해서는 얼추 정리가 되었다.
다음은 캡슐화에 대해서 정리를 해보자.
우리가 클래스를 선언하면 크게 2가지 변수와 메서드를 만들게 된다.
여기서 아무런 설정을 하지 않는다면 클래스 내부의 정보를 쉽게 사용할 수 있을 것이다.
class A{
String Dog = "강아지";
int age = 2;
}
A a = new A();
sysout(a.Dog); //강아지
이러한 사용은 해당클래스의 변수에 직접적으로 접근이 가능하여 보안이 약하다. 보안을 해결하기위해 접근 제한자를 사용한 캡슐화가 사용이 된다.
class A{
private String Dog = "강아지";
private int age = 2;
}
A a = new A();
sysout(a.Dog); //...접근 불가
여기서 사용한 private이 접근 제한자이며 이로서 A클래스는 갭슐화가 되었다. 하지만 이렇게 코드를 작성한다면 Dog의 변수를 사용할 수 없는 오류가 생게 된다. 때문에 필요한 것이 메서드이다. 보통 Getter,Setter라고 부르며 메서드의 이름또한 GetDog()로 변수의 이름을 사용한다.
class A{
private String Dog = "강아지";
private int age = 2;
public Stirng GetDog(){
return Dog;
}
}
A a = new A();
sysout(a.GetDog()); //"강아지"
캡슐화란 변수의 접근제한자로 보안성을 높이는 것을 이야기 한다.
마지막으로 상속이다.
코드로는 extends 이며 자신의 능력을 상속받는 자식이 사용할 수 있게 해준다.
이것은 생산성, 유지보수가 쉬워진다는 장점이 있다.
class A{
String Dog = "강아지";
public Stirng who(){
return Dog;
}
}
class B extends A{
String Cat = "고양이";
@Override
public Stirng who(){
return Cat;
}
}
위 코드처럼 새롭게 작성(오러라이드)하는 것도 가능하며 부모클래스의 기능을 그대로 사용하는 거도 가능하다. 다만 지금 코드는 단순하여 상속을 받을 필요가 없지만 만약 복잡한 코드라고 생각을 한다면 이 방식은 ctrl + c,v보다 더욱 유용할 것이다.
이로써 기본적인 객체지향의 특징들을 정리해보았다.