본문 바로가기

알고리즘 스터디

생활코딩 - 자바 강의를 듣고

728x90

https://opentutorials.org/course/1223/5399

 

객체 지향 프로그래밍 - 생활코딩

객체 지향 프로그래밍 객체지향 프로그래밍(Object-Oriented Programming)은 좀 더 나은 프로그램을 만들기 위한 프로그래밍 패러다임으로 로직을 상태(state)와 행위(behave)로 이루어진 객체로 만드는 것

opentutorials.org

 

자바를 기본부터 다시 배워보자 하는 마음에 생활코딩 자바 강의를 두 번째 수강하였다. 평소 객체지향에 대한 기본적인 개념이 약했던 터라 객체 지향 강의부터 시작하였는데 내 식대로 이해한 개념을 기록하고자 한다.

 

객체지향의 핵심 키워드는 객체이다. 객체는 비슷한 기능을 하는 변수 혹은 메서드들을 그룹으로 묶어 관리하고자 할 때의 솔루션이다. 

 

현실의 문제를 소프트웨어로 가져오는 과정이 추상화(abstract)라고 함. 객체 지향 프로그래밍은 좀 더 현실을 잘 반영하기 위한 노력의 산물이다.

 

잘 설계된 객체는 재활용성이 높고 추상화가 잘 되어 있어 하드웨어의 부품으로 볼 수 있다.

객체 지향과 부품화를 동일시 할 수는 없지만 부품화라고 하는 소프트웨어의 큰 흐름은 객체 지향이 만들어지는데 지대한 공헌을 할 수 있다. 메서드는 부품화의 예라고 할 수 있다.

 

사용자는 모니터가 어떻게 동작하는지는 모르지만 사용하는 방법은 아는 것 처럼 내부의 동작 방법을 단단한 케이스 안으로 숨기고 사용자에게는 그 부품의 사용방법만을 노출하는 것을 은닉화, 캡슐화라고 한다.

 

각각의 부품은 미리 정해진 약속에 따라서 신호를 입, 출력하고 연결점의 모양을 표준에 맞게 만들면 된다. 이러한 연결점을 인터페이스라고 한다. 인터페이스는 부품들 간의 약속이다.

 

클래스와 인스턴스 그리고 객체

객체는 클래스와 인스턴스로 구성되는데 클래스는 설계도, 인스턴스는 제품으로 비유를 할 수 있다. 즉 객체는 설계도인 클래스가 구체적인 실체인 인스턴스가 되었을 때 객체라고 부른다.

 

객체의 구성원은 변수와 메소드가 있다.

Static은 클래스 멤버가 되는 것이다. , 모든 메서드에서 접근이 가능한 변수 혹은 메서드가 된다. Static을 사용하지 않으면 class를 인스턴스화하지 않는 이상 접근이 불가하다. 전역변수와 느낌이 살짝 비슷한데 전역변수는 한 클래스 내의 모든 메서드에서 사용할 수 있는 변수를 의미하지만 클래스 변수는 다른 클래스에서도 참조가 가능하므로 어찌보면 전역변수와는 다른 개념이다.

 

클래스 변수의 용도는

  • 인스턴스에 따라서 변하지 않는 값이 필요한 경우
  • 인스턴스를 생성할 필요가 없는 값을 클래스에 저장하고 싶은 경우
  • 값의 변경 사항을 모든 인스턴스가 공유해야 하는 경우
인스턴스 메소드는(static이 아닌) 클래스 멤버에 접근 할 수 있다.
클래스 메소드는 인스턴스 멤버에 접근 할 수 없다.

 

초기화와 생성자

생성자(Constructor) 메서드는 class와 같은 이름을 가진 메서드로써 클래스를 인스턴스화할 때 초기값을 지정해주는 초기화 역할을 한다. 어떤 메서드보다 가장 먼저 실행이 된다. 자바는 만약 생성자 메서드가 없으면 자동으로 만든다.

 

상속

상속은 어떤 객체가 있을 때 그 객체의 필드와 메소드를 다른 객체가 물려받을 수 있는 기능을 상속이라고 한다. 즉 기존의 객체를 수정하지 않으면서 새로운 객체가 기존의 객체를 기반으로 만들어지게 되는 것이다

하위 클래스를 인스턴스화 할 때 상위 클래스의 기본 생성자를 호출을 하는데 만약 상위클래스에서 기본 생성자를 만들어주지 않고 생성자를 만들었다면 에러가 난다. 이를 해결하기 위해선 부모 클래스에 기본 생성자를 만들어주면 된다. 아니면 자식 클래스에서 super를 통해 부모클래스의 특정 생성자를 호출해주면 에러를 방지할 수 있다.

 

Overriding(재정의)

부모 클래스를 상속 받지만 그 안에 있는 메서드를 변경하고자 할 때 자식 클래스에 같은 부모클래스의 메서드와 같은 이름의 메서드를 재정의하는 것을 오버라이딩이라고 한다. 이 때 메서드의 이름, 메서드의 매게변수의 숫자, 데이터타입, 순서, 메서드의 리턴 타입이 부모 클래스의 것과 일치하여야한다.

 

Overloading

매게변수가 다르면 다른 메서드로 취급받는데, 만약 같은 메서드로 사용하고 싶다면 파라미터가 다른 동명의 메서드를 만들면 된다

 

접근제어자

  public protected default private
같은 패키지, 같은 클래스 허용 허용 허용 허용
같은 패키지, 상속 관계 허용 허용 허용 불용
같은 패키지, 상속 관계 아님 허용 허용 허용 불용
다른 패키지, 상속 관계 허용 허용 불용 불용
다른 패키지, 상속 관계 아님 허용 불용 불용 불용

 

Abstract

직접적으로 사용할 수 없고 상속해서 사용할 수 있게 강제함. 즉 오버라이딩이 필수다. Abstract가 붙어있으면 로직을 가지면 안된다. 또한 메서드 중에 하나라도 abstract가 있으면 클래스 또한 abstract 클래스가 되어야 한다.

 

Final

Abstract와 반대되는 의미를 가지고 있음. 상속이나 변경을 금지하는 규제이다.

 

Interface

어떤 객체가 있고 그 객체가 특정한 인터페이스를 사용한다면 그 객체는 반드시 인터페이스의 매소드들을 구현해야 한다. 인터페이스는 implements를 사용한다. 이는 개발자간의 커뮤니케이션을 돕기 위해 규제를 정해놓는 역할을 함.

예제를 코딩하다 보니 이런 에러가 발생했다.

The public type [class name] must be defined in its own file

검색해보니 파일명과 이름이 일치하는 클래스에서만 public을 지정할 수 있다고 함. 그래서 Interface의 public을 지워주었더니 잘 된다.

Interface의 규칙은 다음과 같다

  • 하나의 클래스가 여러 개의 인터페이스를 구현 할 수 있다.
  • 인터페이스도 상속이 된다.
  • 인터페이스의 멤버는 반드시 public 이다.

Interface와 Abstract의 차이는 다음과 같다.

Abstract classabstract가 붙어 있지 않은 메서드를 통해 로직을 가질 수 있지만 interface는 아니다.

Abstract - 개발 환경의 특수성을 고려하여 클래스의 구현을 개발자에게 위임

Interface - 혼선을 피하기 위한 개발자들간 상호 약속

 

다형성

하나의 메소드나 클래스가 있을 때 이것들이 다양한 방법으로 동작하는 것을 의미한다. 같은 부모를 가진 자식 클래스들을 인스턴스화 할 때 데이터 타입을 부모 클래스로 선언을 하면 재활용성을 높일 수 있다.

 

예외

에러가 예상되는 지점에 try, catch, finally 문을 사용해서 예외처리를 할 수 있고, throws를 사용해서 다음 메서드로 예외 처리를 미룰 수도 있다. 또한 IOException과 ArithmeticException은 그 부모가 RuntimeException 이냐 아니냐에 따라 다른데 IOException 에러는 부모가 RuntimeException이 아니기 때문에 checked Exception으로 try, catch 문으로 반드시 예외처리를 해주어야 한다. 반대로 ArithmeticException은 부모가 RuntimeException 이기 때문에 unchecked Exception으로 예외처리를 안해주어도 throws 할 수 있다.

 

'알고리즘 스터디' 카테고리의 다른 글

[JAVA] BOJ 1463 1로 만들기  (0) 2021.06.29
[JAVA] BOJ 2579 계단 오르기  (0) 2021.06.29
[JAVA] BOJ 1932 정수 삼각형  (0) 2021.06.28
[JAVA] BOJ 1003번 피보나치 함수  (0) 2021.06.26
[JAVA] BOJ 9461 파도반 수열  (0) 2021.06.26