자바는 객체지향언어이기에, 큰 프로그램을 개발할 때 유지보수/재사용성이 좋다. 이러한 객체지향은 4가지 특징을 가진다.
우선 필요한 기능만을 모아 클래스 단위로 추상화한다. 이 클래스 내부의 데이터를 보호하기 위해 접근 범위를 제한할 수 있다. 또한, 클래스들끼리 상속을 통해 재사용+확장을 한다. 마지막으로 같은 메소드이름이지만, 클래스(객체) 특성에 따라 다양하게 동작하게 할 수 있다. 이러한 객체지향 특징 4가지를 정리해보았다.
추상화(Abstraction)
- 하나의 클래스 역할에 맞는 기능만 최소한으로 구성/분리한다.
- 클래스/인터페이스로 추상화한다.
- 그리고 해당 기능(클래스)을 재사용+확장하고 싶으면 상속받아서 다형성을 구현한다.
캡슐화(Encapsulation)
- 접근 제어자로 클래스 내부를 보호(접근 제한)한다.
- 외부에서 함부로 클래스 내부의 데이터를 변경하지 못하도록 제한한다.
- 접근 제어자
- public : 해당 클래스에서만 접근 가능
- protect : 해당 패키지 내에서만 접근 가능
- default : 동일 패키지 혹은 해당 클래스를 상속받은 클래스에서 접근 가능
- private : 모든 클래스에서 접근 가능
public class Car {
// ...
private int speed;
public int getSpeed() {
return color;
}
public void setSpeed(int speed) {
this.speed = speed;
}
// ...
}
상속(Inheritance)
- 재사용 + 확장할 수 있다.
- The Car IS-A Vehicle
- 사실 is-a 보다는 is-a-kind-of 가 적절하다(종류, 분류).
public class Vehicle {
private int wheels;
private String model;
public void start() {
// the process of starting the vehicle
}
public void stop() {
// process to stop the vehicle
}
public void honk() {
// produces a default honk
}
}
public class Car extends Vehicle {
private int numberOfGears;
public void openDoors() {
// process to open the doors
}
}
다형성(Polymorphism)
- 한 메소드 이름으로 여러 동작 수행할 수 있다.
- 오버로딩 / 오버라이딩이 있다.
- 오버로딩 : 메소드명은 같지만, 매개변수의 타입/갯수가 다르게 구현하기
리턴값만 다르면 오버로딩 안된다. 메소드이름 하나로 다양한 객체를 받아 각자에 맞게 처리할 수 있다.
public String read() {
return this.getContent()
.toString();
}
public String read(int limit) {
return this.getContent()
.toString()
.substring(0, limit);
}
public String read(int start, int stop) {
return this.getContent()
.toString()
.substring(start, stop);
}
- 오버라이딩 : 상위 클래스의 메소드를 하위 클래스에서 재정의하기 하위 클래스에서 부모의 메소드들을 재사용 + 확장할 수 있다.
// 부모 클래스
public class GenericFile {
public String getFileInfo() {
return "Generic File Impl";
}
}
// 자식 클래스
public class ImageFile extends GenericFile {
// 오버라이딩
public String getFileInfo() {
return "Image File Impl";
}
}
정리하면
- 자바는 객체지향 언어로 유지보수/재사용성이 좋다. 객체 지향의 특징은 크게 4가지이다.
- 우선 필요한 기능/데이터만을 클래스로 추상화한다.
- 이 클래스 내부 데이터를 보호하기 위해 접근제어자로 캡슐화한다.
- 클래스들끼리 상속을 통해 기능을 재사용+확장을 한다.
- 그리고 오버로딩과 오버라이딩으로 통해 다형성을 구현한다.