OOP(객체지향프로그래밍)

객체 지향이란

stophyeon 2023. 12. 19. 18:20
728x90

Java는 객체지향 프로그래밍 언어입니다.

객체지향이라는 말에서도 알 수 있듯이 객체를 지향한다는 말입니다.

객체란

객체란 속성과 행동을 정의한 것입니다.  프로그래밍에서 말하는 속성과 행동이란 변수와 함수를 말합니다. 

객체를 정의할 때는 클래스로 정의합니다. 즉, 클래스에 있는 멤버변수와 메소드가 객체를 정의하는 요소인 것입니다.

객체를 정의하는 클래스에 구성요소로는 멤버변수,메서드,생성자등이 있습니다.

객체지향 사용이유

그렇다면 이런 객체를 사용하는 객체 지향 프로그래밍의 장점은 유지보수에 용이하고 재사용성이 높다는 것입니다.

에를 들어 자동차의 바퀴가 고장났다면 자동차 전체를 바꾸는 것보단 바퀴만 교체하는 것이 효율적입니다.

바퀴만 교체를 하려면 자동차를 만들 때 바퀴가 탈부착이 가능하게 만들어야 합니다.

즉, 객체를 정의한 클래스들을 이용해서 어떤 서비스를 만들었는데 에외가 발생하거나, 생각하지 못한 입력이 들어왔을 경우 예외가 발생한 부분의 클래스만을 수정하고, 새로운 입력에 대한 새로운 클래스를 추가한다면 문제를 해결할 수 있습니다. 위와 같은 이유가 객체지향을 사용하는 이유입니다.

 

객체지향의 특징 3가지 

객체 지향의 특징으로 정보은닉(캡슐화)/상속/다형성/(추상화)가 있습니다.

1.정보은닉(캡슐화)

정보은닉이란 사용자에게 메소드나 변수를 일부만 보여주거나 사용가능하게하는 것입니다.

위 기능을 구현하는 것이 접근제어자입니다.

public  - 모든 클래스에서 접근가능

protected -  같은 클래스내에서만 접근 가능

private -  같은 패키지내의 모든 클래스와 해당 클래스를 상속받은 자식 클래스만 접근 가능

default - 접근제어자를 생략했을 경우 적용됩니다. 같은 패키지의 클래스만 접근 가능

이 4가지가 Java에서 사용할 수 있는 접근제어자입니다. 

Class와 멤버변수, 메서드에 위의 접근제어자를 사용해서 다른 클래스에서 사용할지 안할지를 결정합니다.

2. 상속

상속은 한 클래스(상위 클래스)의 멤버변수와 메서드를 다른 클래스(하위 클래스)에서 사용할 수 있게 하는 것입니다.

단순히 import를 사용하는 것과 같아 보일 수 있지만 상위클래스의 메서드를 재정의(오버라이딩)할 수 있고, 추상클래스를 

정의해서 사용할 수 도있습니다. 

3. 다형성

상속받은 하위 클래스를 상위 클래스로 형변환시에는 묵시적으로 형변환이 가능합니다.

예를 들어 A(상위),B(하위)가 있을 때 A a = new B()로 B클래스로 생성한 뒤 A클래스로 형변환을 한 것입니다.

반대의 경우는 다운캐스팅이라고 합니다 상위 클래스를 하위클래스로 형변환하는 것입니다. 다운 캐스팅시에는

명시적으로 형변환을 할 클래스를 선언해줘야 합니다 에를 들어 B b = (B)a 와같이 선언해줘야 합니다.

다형성이란 한 타입의 참조 변수를 통해 여러 타입의 객체를 참조할 수 있도록 하는 것이다 예를 들어 상위 클래스로의 형변환에서 각각 다른 클래스의 생성자로 인스턴스를 만들면 같은 클래스이지만 각각의 메서드 결과값과 메서드 종류가 다릅니다. 이 와 같은 효과를 다형성이라고 합니다

 

객체 지향에서 중요한 것

객체 지향을 공부하면 가장 많이 듣는 말은 "관계"입니다. 클래스들이 상속을 하거나 다른 클래스를 클래스내부에서 사용하는 것을 관계라고 합니다. 관계가 중요한 이유는 한 클래스를 변경하면 다른 클래스들중 변경해줘야 하는 클래스와 변경이 되면 안되는 클래스들이 있습니다. 이럴 때 관계를 맺는다면 변경할 때마다 일일이 클래스 전체를 볼 필요가 없습니다.

관계의 종류로는4가지가 있습니다 (class A & class B & interface C) 

1. 연관관계 -  A의 멤버변수로 B가 있는 경우(관계가 오래 유지)

2. 상속관계 - A extends B인 경우

3. 의존관계 - A의 메서드의 매개변수,반환값,반환형이 B인 경우(관계가 메서드 실행시에만 유지)

4. 실체화관계 - A implements C인경우

이 4가지 종류로 클래스들간의 관계를 맺을 수 있습니다.

이렇게 관계를 맺는 것이 무조건적으로 좋은 것은 아닙니다. 처음에 설계를 할때

어떤 클래스를 구현할지, 어떤 클래스들간에 어떤 관계를 맺을지를 결정하고 구현을 시작해야 합니다.

또한 관계를 맺을 때에도 양방향 관계보다는 단방향 관계를 맺는 것을 지향하고, 다중성이 적게 하는 것이 좋습니다.

양방향 관게룰 맺는 것은 사실상 두클래스를 하나의 클래스로 만드는 것이 좋습니다.

다중성을 적게한다는 것은 N:1의 관계보다는 1:N의 관계를 지향한다는 것입니다.

여러개의 클래스가 한 클래스에 참조되는 것보다는 한개의 클래스르가 여러 클래스에서 참조되도록 한다는 것입니다.

 

이상으로 객체지향에서 전체적으로 봤을 때 중요한 것을 정리해 보았습니다.