면접에서 똑부러지게 말하기 위해 돌아왔다. 기본 중의 기본으로!
1. 객체 지향 프로그래밍
정의(What?)
객체 지향 프로그래밍은 기존의 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 상태와 행위를 가진 객체로 파악하는 것이다.
이러한 각각의 객체들의 역할이 무엇인지를 정의하여 객체들 간의 상호작용을 확인하여 프로그램을 구성하는 것을 말한다.
즉, 객체를 통해 "누가 어떤 일을 할 것인가?"를 정의하는 것이 핵심이다.
특징으로는 캡슐화, 상속, 다형성, 추상화 등이 있다.
왜 써?(Why?)
객체의 역할에 의한 상호작용으로 프로그램이 구성되므로, 해당 역할을 수행할 수 있는 어떤 객체든 대체 가능하다.
즉 유지보수성, 확장성, 재사용성이 뛰어남
안쓰면 뭐가 불편해?(Why Not?)
전체 시스템에서 특정 역할을 하는 파트는 다른 파트와 유기적으로 연결되어 있기 때문에 하나의 변경이 정말 수많은 변경을 초래할 수 있다. 이는 시스템의 문제를 발생할 가능성이 높으므로, 시스템에서 특정 역할을 하나는 파트는 그 역할을 맡을 수 있는 누가와도 수행할 수 있도록 설계한 것이다.
2. 객체 지향의 4가지 특징
1) 캡슐화 -> 정보 은닉을 통한 데이터 보호
정의(What?)
클래스 안에 서로 연관있는 속성과 기능들을 하나의 캡슐(capsule)로 만들어 데이터를 외부로부터 보호하는 것
ex. 필드를 private 접근 제한자로 선언 후, getter or 생성자로만 호출/초기화할 수 있도록 설정
왜 써?(Why?)
접근 제어자를 통한 정보 은닉
객체 지향 프로그래밍에서는 캡슐화를 통해 객체가 외부에 노출하지 않아야할 정보 또는 기능을 접근제어자(private,public 등)을 통해 적절히 제어 권한이 있는 객체에서만 접근하도록 할 수 있기에 코드의 수정이 일어났을 때 책임이 있는 객체만 수정하면 되기에 영향 범위를 예측하는데 수월해졌다.
public class Person{
private int age;
private String name;
public int getAge() {
return age;
}
public String getName() {
return name;
}
}
2) 상속 -> 코드 재사용성 확보
정의(What?)
부모클래스의 속성과 기능을 그대로 이어받아 사용할 수 있게하고 기능의 일부분을 변경해야 할 경우 상속받은 자식클래스에서 해당 기능만 다시 수정(정의)하여 사용할 수 있게 하는 것
왜 써?(Why?)
클래스를 상속 받아 수정하여 사용하기 때문에 중복 코드를 줄일 수 있다.
3) 추상화 -> 핵심 강조
정의(What?)
"공통의" 속성이나 기능을 묶어 이름을 붙이는 것
ex. 인터페이스와 구현체를 분리하는 것
왜 써?(Why?)
복잡한 것을 단순화하여 이해하기 쉽게 설계하기 위함
interface DiscountPolicy{
//할인되는 가격 반환
public int discount(Member member, int price);
}
class RateDiscountPolicy implements DiscountPolicy{
//상품 가격의 10%를 할인하여 할인되는 가격을 반환
@Override
public int discount(Member member, int price){...}
}
4) 다형성 -> 객체 행동 변경 용이
정의(What?)
어떤 변수, 메서드가 상황에 따라 다른 결과를 내는 것
즉 오버라이딩(Overriding),오버로딩(Overloading)이 가능하다는 뜻이다.
오버로딩
ex.java의 println() 메서드
같은 이름의 메서드를 다양한 매개변수 타입과 개수로 받아 사용할 수 있는 것.
매개변수의 타입과 개수는 다르지만 항상 같은 결과를 반환한다.
println()
println(boolean x)
println(char x)
println(char[] x)
println(double x)
println(float x)
println(int x)
println(long x)
println(Object x)
println(String x)
오버라이딩
부모-자식의 상속 관계에 있는 클래스에서 상위 클래스(부모)의 메서드를 하위 클래스(자식)에서 재정의하는 것
class Parent {
void display() {
System.out.println("부모 클래스의 display() 메소드입니다.");
}
}
class Child extends Parent {
void display() {
System.out.println("자식 클래스의 display() 메소드입니다.");
}
}
왜 써?(Why?)
불필요한 코드 중복을 방지함으로써 코드의 재사용성과 유연성을 높여준다.
오버로딩의 경우 같은 기능을 하는 메서드가 다양한 매개변수를 받을 수 있음으로써 코드 유연성이 증가하고,
오버라이딩의 경우 부모 클래스의 메서드를 자식 클래스에서 재정의함으로써 객체의 행동 변경이 용이한 장점이 있다.
'Development > Java' 카테고리의 다른 글
객체지향 설계원칙 : SOLID 란? (3) | 2024.02.27 |
---|---|
boolean 바인딩 에러.. boolean과 Boolean의 차이 (2) | 2024.02.02 |
KakaoAPI를 활용해 위치기반 장소 검색 Java 애플리케이션을 개발해보자 (0) | 2023.09.04 |
KakaoAPI를 활용해 책을 검색하는 JAVA 애플리케이션을 만들어보자 (2) | 2023.08.31 |