본문 바로가기

CS

[Java] 객체 지향

프로그래밍에 입문하는 사람 또는 Java에 입문하는 사람이라면 무조건 들어봤을 객체 지향

 

그럼 객체 지향은 무엇일까?

 

우선 객체에 대해 알아야한다.

 

객체

객체란 사전적인 정의로 실제 존재하는 것을 말한다.

 

그러나 프로그래밍에서의 객체는 필드(데이터들의 집합), 메소드(함수)들의 집합이라고 보면 된다.

 

필드

String name;
Int grade;

 

메소드

void example(){...}
void example2(){...}

 

또한 필드와 메소드들을 담고 있는 일종의 케이스가 바로 클래스이다.

 

클래스

public class Example {
	String name;
	int grade;

	void example(){...}
	void example2(){...}
}

 

 

객체 지향의 특징

1. 추상화

추상화란 과정은 감추면서 결과만 나타내는 방식이다.

 

예를 들어, 우리가 게임을 할 때 그 게임이 어떤 로직으로 돌아가는지 마우스 클릭 한번에 무슨 일이 내부에서 일어나는지 알고 게임을 하지 않는다. 그저 조작법대로 게임을 할 뿐...

 

또는 우리가 엑셀, 브레이크, 핸들을 이용하여 운전을 하지만 내부에선 무슨 일이 일어나는지 모르고 운전을 하는 것처럼 내부 로직은 감추고 핵심 기능만 노출하는 것을 추상화라고 한다.

class A {
    ....
    public fun func(){...}
}

class Main(){
    val a = A()
    a.func()
}

 

다음과 같은 코드에서 func()의 코드를 수정 또는 변경하고 싶을 때, 이 메서드가 사용되는 부분은 그대로 두고 A 클래스에서의 func()만 변경하면 된다.

 

2. 캡슐화

일종의 캡슐로 내부 객체를 보호하는 것

클래스 또한 캡슐의 일종

예를 들면, 사람의 장기를 객체라 한다면 캡슐은 장기를 보호하는 뼈, 피부, 근육 등을 가리킨다.

 

객체 내부에 있는 메소드들 중 객체 내부에서만 쓰이고, 외부에서는 접근할 수 없도록 private를 사용하여 접근을 제한할 수도 있다.

 

3. 상속

자식 클래스가 부모 클래스로부터 속성을 물려받는 것

부모 클래스의 확장의 개념으로 중복 제거의 역할도 있다.

 

다음과 같이 두 객체 A, B가 있을 때

class A {
    lateinit var name: String
    val age: Int = 20
    val school: String = "Android"
    lateinit var a_variable: String
    
    constructor(name: String, a_variable: String){
        this.name = name
        this.a_variable = a_variable
    }

    fun student(){...}
    fun A_Func(){...}
}

class B {
    lateinit var name: String
    val age: Int = 20
    val school: String = "Android"
    lateinit var b_variable: String
    
    constructor(name: String, b_variable: String){
        this.name = name
        this.b_variable = b_variable
    }

    fun student(){...}
    fun B_Func(){...}
}

 

필드 name, age, school 메서드는 student가 A와 B 객체에 중복되어 작성되어 있다.

 

이때, 중복되는 메서드와 필드를 하나의 클래스에 재정의하고, 그 클래스를 상속받으면 중복없이 깔끔하게 정리할 수 있다.

 

class C {
    lateinit var name: String
    val age: Int = 20
    val school: String = "Android"
    
    constructor(name: String){
        this.name = name
    }

    fun student(){...}
}

class A: C() {
    lateinit var a_variable: String
    
    constructor(name: String, a_variable: String){
        super(name)
        this.a_variable = a_variable
    }

    fun A_Func(){...}
}

class B: C() {
    lateinit var b_variable: String
    
    constructor(name: String, age: Int, school: String, b_variable: String){
        super(name)
        this.b_variable = b_variable
    }

    fun B_Func(){...}
}

 

 

 

4. 다형성

상황에 따라 다르게 쓰이는 것

 

- 오버라이딩 ( Overriding ) : 같은 메소드의 이름을 사용하지만 그 안의 내용을 바꾸는 것

public class Example {
	String name;
	int grade;

	public void example(){
		System.out.println("Example");
	}
}

public class Example2 extends Example {
	// Example Class의 example method overrinding
	public void example(){
		System.out.println("Example2");
	}
}

 

- 오버로딩 ( Overloading ) : 메소드의 매개변수에 따라 다르게 정의

public class Example {
	String name;
	int grade;

	public void example(){...}
	public void example(String a){...}
	public void example(String a, int b){...}
}

public static void main(Stiring args[]){
	Example exam = new Example();
	
	exam.example("홍길동");
	exam.example("홍길동", 24);
}

 

 

객체 지향 SOLID 원칙

https://hckcksrl.medium.com/solid-%EC%9B%90%EC%B9%99-182f04d0d2b

 

SOLID 원칙

객체지향 설계원칙

hckcksrl.medium.com

 

 

객체 지향의 장·단점

장점

  • 코드의 재사용성 용이
  • 생산성 향상
  • 자연적인 모델링
  • 유지보수의 용이성

단점

  • 실행 속도가 느림
  • 프로그램 용량이 커질 수 있음
  • 설계에 많은 시간 소요

'CS' 카테고리의 다른 글

함수형 프로그래밍  (0) 2024.08.13
운영체제의 메모리 관리  (0) 2024.08.13