객체지향 특징 4가지

GaramFlow·2023년 10월 19일
0

객체지향 특징

  • 객체지향의 주요 특징에 대해 알아본다.
  • 해당 특징을 사용하는 목적 및 이점에 대해서 알아본다.
  • 해당 특징들의 예시 코드에 대해서 알아본다.

1) 캡슐화

(1) 캡슐화란 무엇인가?

  • 관련된 것을 적절하게 잘 모아서 가지고 있는 것을 캡슐화라고 할 수 있다.
  • 해당 객체의 상태(데이터)와 행동(메소드)를 결합하고 외부로부터 직접적인 접근을 제한하는 방식이다.
  • 해당 객체를 외부에서 변경할 수 없게해서 객체 내부를 보호한다.

(2) 캡슐화를 사용하는 목적은 무엇인가?

  • 높은 응집도와 낮은 결합도를 유지하기 위해서 사용하며, 이를 통해 재사용성, 유지보수성 등이 향상된다.
    • 높은 응집도 : 모듈이 단일 목적으로 하나의 작업이나 책임에 집중해서 긴밀하게 작동하는 것을 의미한다. 유지보수성, 재사용성에 장점이 있다.
    • 낮은 결합도 : 모듈이 각자 독립적으로 동작할 수 있는 것을 의미한다. 하나의 모듈이 변경되어도 다른 모듈에 미치는 영향이 적어진다.

(3) 캡슐화 사용 시 이점은 무엇인가?

  • 보안 : 객체 상태를 직접 수정할 수 없어서 무결성을 보호한다.
  • 재사용성 : 캡슐화된 객체는 재사용하기 쉬워진다.
  • 유연성 : 내부 구현이 숨겨져 있으므로 변경되더라도 외부에서 사용하는 코드를 수정하지 않아도 된다.
  • 단순성 : 내부 구현이 숨겨져 있으므로 사용자는 간단한 인터페이스만 제공받아서 사용할 수 있다.

(4) 예시 코드

주요 키워드

  • private 멤버 변수
  • public 메소드
  • Getter, Setter
// User 클래스에 name과 email이 은닉화된 상태로 캡슐화되어있다.
public class User {
    // private로 변수를 캡슐화해서 외부 접근을 제한한다.
	private String name;
	private String email;

    // 생성자를 통해 초기화한다.
	public User(String name, String email) {
		this.name = name;
		this.email = email;
	}

    // Setter, Getter를 통해 외부 접근 방법을 제공한다.
	public String getName() {
		return name;
	}
    public void setName(String name) {
		this.name = name;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String name) {
		this.email = email;
	}
}
public static void main(String[] args) {
    User user = new User("John", "test@gmail.com");

    person.setName("Doe");
    person.setEmail("test2@gmail.com");
    System.out.println(user);
}

2) 추상화

(1) 추상화란 무엇인가?

  • 중요한 건 남기고 불필요한 건 제거하는 것이다.
  • 복잡한 현실 세계를 단순하게 표현하는 방식을 말한다.
  • 프로그래밍에서는 시스템 내 핵심적인 개념, 객체를 구체적인 구현이 아니라 간단하고 일반적인 방식으로 표현하는 걸 말한다.
  • 경우에 따라 필요한 정보가 다르므로 프로그램에 맞게 추상화를 해야한다.

(2) 추상화를 사용하는 목적은 무엇인가?

  • 복잡한 내용을 단순화해서 개발자가 핵심적인 내용에만 집중할 수 있게 도와준다.
  • 중요한 부분에 집중해서 효율적인 개발과 유지보수를 가능하게 하는 데 목적이 있다.

(3) 추상화 사용 시 이점은 무엇인가?

  • 재사용성 : 공통적인 특징을 추출해서 재사용 가능하게 만들어준다.
  • 유지보수 : 시스템의 각 부분을 독립적으로 수정 및 개선할 수 있다.
  • 확장성 : 추상화된 개념에 새로운 기능 및 속성을 추가하기 쉽다.
  • 복잡도 관리 : 복잡도가 줄이고 핵심 기능에 집중할 수 있다.

(4) 예시 코드

주요 키워드

  • abstract
  • interface
public abstract class Car {
	public Car(String name) {
		System.out.println("Car 생성자 호출 : " + name);
	}

	public abstract void run();
}

public class Bus extends Car {
	public Bus() {
		super("Bus");
		System.out.println("Bus 기본 생성자");
	}

	@Override
	public void run() {
		System.out.println("run bus");
	}
}

3) 상속

(1) 상속이란 무엇인가?

  • 하나의 클래스의 기능을 받아서 새로운 클래스로 생성하는 것이다.
  • 부모 클래스의 속성과 메소드를 자식 클래스가 받아오는 것을 말한다.
  • 상속 관계는 "xx는 oo이다.", "xx는 oo의 한 종류이다." 라고 표현할 수 있다.

(2) 상속을 사용하는 목적은 무엇인가?

  • 코드 재사용성을 높이고 유지보수를 용이하게 만들기 위해 사용한다.
  • 로직의 중복을 최대한 줄여줘서 개발 시간 및 코드의 양을 단축시켜준다.
  • 클래스 간 관계가 계층적이여서 구조의 계층화와 가독성에 도움이 된다.

(3) 상속 사용 시 이점은 무엇인가?

  • 재사용성 : 기존 코드 재사용이 가능해서 새로운 클래스 생성이 쉬워진다.
  • 확장성 : 기존 클래스 기능을 확장해서 새로운 기능 추가가 쉬워진다.
  • 계층적 구조 : 클래스 간 관계가 계층적으로 구성되어 체계적으로 관리가 가능하다.

(4) 예시 코드

주요 키워드

  • extends
public class Parent {
	public int i = 5;
	public void printI() {
		System.out.println("parent + printI() : " + i);
	}
}

public class Child extends Parent {
	public int i = 15; // 필드에 대한 오버라이딩
	public void printI() { // 메소드에 대한 오버라이딩
		System.out.println("child + printI() : " + i);
	}
}
public class Exam1 {
	public static void main(String[] args) {
		Parent p1 = new Parent();
		System.out.println(p1.i); // 5
		p1.printI(); // parent + printI() : 5

		Child c1 = new Child();
		System.out.println(c1.i); // 15
		c1.printI(); // child + printI() : 15
	}
}

4) 다형성

(1) 다형성이란 무엇인가?

  • 클래스 등이 다양한 방식으로 동작가능하다는 특징이다.
  • 많은 형태를 가지는 능력을 의미하는데, 예를 들어 하나의 인터페이스를 통해 다양한 타입 객체를 참조하고 다룰 수 있다.
  • 같은 메소드 이름을 가지고 있지만 다른 동작을 하는 경우나 다른 타입의 인자를 받는 경우가 있다.

(2) 다형성을 사용하는 목적은 무엇인가?

  • 객체지향 프로그래밍에서 코드를 더 유연하게, 더 쉽게, 확장하기 더 쉽게 만들기 위해서 사용한다.

(3) 다형성 사용 시 이점은 무엇인가?

  • 코드의 유연성 : 하나의 코드 라인에 다양한 타입 객체가 동작할 수 있다.
  • 재사용성 : 공통 인터페이스를 공유하다보니 새로운 클래스를 추가해도 기존 코드를 재사용할 수 있다.
  • 유지보수 : 공통 인터페이스를 공유해서 유지보수가 편하다.
  • 확장성 : 새로운 클래스를 시스템에 추가할 때 기존 클래스를 변경하지 않아도 새로운 기능을 추가할 수 있다.

(4) 예시 코드

주요 키워드

  • interface
  • implements
// 다형성 - 메소드 오버로딩 예시
public class StandardOutput {
	public void println(boolean b) {
		System.out.println(b);
	}
	public void println(int i) {
		System.out.println(i);
	}
	public void println(double d) {
		System.out.println(d);
	}
	public void println(String s) {
		System.out.println(s);
	}

	public static void main(String[] args) {
		StandardOutput output = new StandardOutput();
		output.println(100);
		output.println("hello");
		output.println(10.5);
		output.println(false);
	}
}

2023/10/20 작성
2023/11/10 내용 구성 변경 및 추가

profile
간단한 지식 저장 및 공유를 위한 블로그입니다.

0개의 댓글