객체란 무엇인가?
- 객체는 상태(필드)와 동작(메서드)를 가진다.
- 객체는 클래스의 인스턴스를 나타내며 메모리의 공간을 차지한다.
클래스란 무엇인가?
- 객체를 생성하기 위한 템플릿 또는 청사진입니다.
- 클래스는 인스턴스화하기 전까지는 메모리의 힙 영역을 소모하지 않는다.
추상화란 무엇인가?
- 사용자와 관련있는 내용만 노출하고 나머지 세부 내용은 숨기는 개념입니다.
- 추상화를 통해 어플리케이션이 일을 수행하는 방법에 집중이 아닌 수행하는 일 자체에 집중한다.
- 내용을 노출하는 복잡성을 줄이고 코드의 재사용성을 높이며 코드 중복을 방지함으로써 낮은 결합도와 높은 응집도를 유지한다.
public interface car {
public void speedUp(); // 속도 높이기
public void slowDown(); // 속도 낮추기
public void turnRight(); // 우회전
public void turnLeft(); // 좌회전
public String getCarType(); // 자동차 유형
}
public class ElectricCar implements Car {
private final String carType;
public ElectricCar(String carType) {
this.carType = carType;
}
@Override
public void speedUpO {
System.out.println("Speed up the electric car");
}
@Override
public void slowDown() {
System.out.printIn("Slow down the electric car");
}
@Override
public void turnRight() {
System.out.printIn("Turn right the electric car");
}
@Override
public void turnLeft() {
System.out.printIn("Turn left the electric car");
}
@Override
public String getCarType() {
return this.carType;
}
}
- 위처럼 car라는 인터페이스를 생성 후 ElectricCar라는 클래스에서 상속받아 구현했습니다. 전기차량 클래스가 아닌 자동차 유형이 경유차량(GasCar)이나 디젤차량(DieselCar)인 경우에는 해당 차량 유형에 맞는 클래스를 생성 후 같은 Car라는 인터페이스를 상속받아 구현할 수 있습니다. 이 처럼 적절한 상황에 맞춰 인터페이스를 활용하면 코드 중복을 줄이고 재사용을 할 수 있는 객체지향적인 어플리케이션을 만들 수 있습니다.
캡슐화란 무엇인가?
- 객체 상태가 외부로부터 숨겨진 상황에서 이 상태에 접근하는 일련의 공개 메서드만 노출하는 기법
- 캡슐화는 정보 은닉 메커니즘, 각 객체가 클래스 내에서 객체의 상태를 비공개로 유지합니다.
- 자바에서 캡슐화는 접근제어자(public,private,protected)로 구현합니다.
public class Cat {
private int mood = 50;
private int hungry = 50;
private int energy = 50;
public void sleep() {
System.out.println("Sleep...");
energy++;
hungry++;
}
public void play() {
System.out.println("Play...");
mood++;
energy--;
meow();
}
public void feed() {
System.out.println("Feed...");
hungry--;
mood++;
meow();
}
private void meow() {
System.out.println("Meow!");
}
public int getMood() {
return mood;
}
public int getHungry(){
return hungry;
}
public int getEnergy(){
return energy;
}
}
public static void main(String[] args) {
Cat cat = new Cat();
cat.feed();
cat.play();
cat.feed();
cat.sleep();
}
- 위처럼 Cat 클래스에서 meow()라는 메서드를 private으로 생성해서 다른 클래스에서 접근이 불가하다. 그럼으로 meow라는 함수는main클래스에서 사용할수가 없습니다. 캡슐화를 할 때 생각해야하는 부분이 왜 정보를 은닉해야하는지 생각하고 하는게 좋다.
상속이란 무엇인가?
- 상속은 객체가 다른 객체의 코드를 재사용할 수 있도록 허용하여 코드의 재사용성을 유지합니다. 또한 각 객체만의 로직도 추가할 수 있습니다.
- IS-A 관계로 부모 자녀 관계입니다.
- 자바에서 상속은 extends 키워드로 구현할 수 있습니다.(여러개의 클래스를 상속할 수 없습니다)
// 직원 클래스
public class Employee{
private String name;
public Employee(String name){
this.name = name;
}
}
// Employee - 부모 클래스
// Programmer - 자식 클래스
public class Programmer extends Employee {
private String team;
public Programmer(String name, String team){
super(name);
this.team = team;
}
}
다형성이란 무엇인가?
- 다형성은 polymorphism이라고 하는데 poly(많다) morph(형태)라는 2개의 그리스어로 구성된 단어입니다. 다형성은 많은 형태를 의미합니다. 다양한 형태로 객체가 때에 따라 다르게 동작 할 수 있습니다.
- 다형성 구현하는 방법
- 메서드 오버로딩 : 매개변수가 다른 경우 컴파일러가 오버로드된 메서드 가운데 어떤 형식을 호출할 것인지 컴파일 시간에 식별 가능하다. 컴파일 타임 다형성이라고 불린다.
public class Triangle{
public void draw(){
System.out.println("Draw default triangle ...");
}
public void draw(String color){
Syste.out.println("Draw a triangle of color" + color);
}
public void draw(int size,String color){
Syste.out.println("Draw a triangle of color" + color +
" and scale it up with the new size of " + size);
}
}
// 메인에서 호출 하기
public static void main(String[] args){
Triangle triangle = new Triangle();
triangle.draw();
triangle.draw("blue");
triangle.draw(10,"blue");
}
// 출력 결과
// Draw default triangle ...
// Draw a triangle of color blue
// Draw a triangle of color blue and scale it up with the new size of 10
- 메서드 오버라이딩: IS-A 관계이며, 런타임 다형성으로 불립니다. 인터페이스 생성 후, 각 클래스의 특화된 동작을 수행하기 위해 인터페이스에 있는 메서드를 오버라이드 한 후 구현한다.
public interface Shape{
public void draw();
}
public class Triangle Implements Shape{
@Override
public void draw(){
System.out.println("Draw a triangle ...");
}
}
public class Rectangle implements Shape{
@Override
public void draw(){
System.out.println("Draw a rectangle ...");
}
}
public class Circle implements Shape{
@Override
public void draw(){
System.out.println("Draw a circle ...");
}
}
// 메인 호출
public static void main(String[] args){
Shape triangle = new triangle();
Shape rectangle = new Rectangle();
Shape circle = new Circle();
triangle.draw();
rectangle.draw();
circle.draw();
}
// 출력 결과
// Draw a triangle ...
// Draw a rectangle ...
// Draw a circle ...
reference:
- 자바 코딩 인터뷰 완벽 가이드
'Java' 카테고리의 다른 글
[Spring] 예외처리(ExceptionHandling)하는 방법 (0) | 2023.03.12 |
---|---|
[JAVA] JUnit 5 사용해보자! (0) | 2023.02.27 |
[Spring] @Autowired를 사용하지말고 다양한 의존성 주입을 알아보자 (0) | 2023.01.25 |
[JAVA] Process와 Thread - 일해라 일! (0) | 2023.01.22 |
[JAVA] SOLID란? - 좋은 객체지향 설계 5가지 원칙 (0) | 2023.01.08 |