[JAVA] 객체지향(4) - 패키지, 상속

3956 단어 Java객체지향Java

이 글은 김성박선생님의 4/5 강의를 바탕으로 쓰여진 글입니다.
더 자세한 내용은
https://www.facebook.com/groups/codingeverybody/posts/7530033737037097/ 를 참고해주세요.


좋은 객체는 응집도는 높고 결합도(Coupling)는 낮다.

객체의 역할, 책임 그리고 협력

좋은 객체란 역할과 책임에 충실하면서, 다른 객체와 잘 협력하여 동작하는 객체를 말한다. 반대로 나쁜 객체란 여러가지 역할을 한 가지 객체에게 부여하거나, 이름과는 맞지 않는 속성과 기능을 가지도록 하거나 제대로 동작하지 않는 객체를 말한다. 또한 다른 객체와도 동작이 매끄럽지 않는 객체를 의미한다.

다형성(Polymorphism)

프로그램 언어의 다형성은 그 프로그래밍 언어의 자료형 체계의 성질을 나타내는 것으로, 프로그램 언어의 각 요소들(상수,변수,식,오브젝트,함수,메소드 등)이 다양한 자료형(type)에 속하는 것이 허가되는 성질을 가리킨다. 반댓말은 단형성으로, 프로그램 언어의 각 요소가 한가지 형태만 가지는 성질을 가리킨다.

출처: 위키피디아

System.out.println(...)

  • println "인자를 출력하고 줄바꿈을 한다." 라는 기능이다.
  • 여기서 인자는 int, float, double, String이 될 수 있다.
  • 중요한건 메소드 이름이 같다는 것이다. 왜 메소드 이름이 같다는 것이 중요할까?

System 클래스를 찾아보자!

주목해야 할 점은 메소드 이름은 같지만, 받아들이는 type이 다르다는 것이다.

다형성 - 메소드 오버로딩(Overloading)

  • 메서드의 이름은 같고 매개변수의 갯수나 타입이 다른 메소드를 정의하는 것을 말한다.
  • 리턴값만을 다르게 갖는 오버로딩은 작성 할 수 없다.

만약 메소드이름이 다 다르다고 생각해보면, 사용자는 불편한 일들을 많이 겪게 된다.

예를 들어, int를 출력하는 메소드의 이름은 printInt이고, 문자열을 출력하는 메소드가 printString 이라고 한다면 사용자는 많은 메소드의 이름을 외워야 할 것이다.

StandardOutput 클래스

위와 같이 메소드명은 같으나 매개변수가 다른 메소드들을 만들었다.

이러한 것을 오버로딩(overloading)이라고 한다.

StandardOutput 클래스가 static한 필드를 갖고 있지 않기 때문에, println은 인스턴스메소드이다.
위의 메소드를 실행시키기 위해서는

1. 인스턴스를 만들어서 사용한다.
2. static 필드를 생성한다.

위 2가지 방법이 필요하다고 저번 시간에 배웠다!

실행시켜보자,
실행을 시키기 위해서는 static한 메소드가 있어야 한다.

패키지

  • 클래스는 패키지를 이용하여 관련된 클래스들 관리한다. 자바에서 패키지는 폴더와 거의 같은 기능을 제공한다고 생각하면 된다.

패키지 이름 규칙

  • 패키지 이름은 보통 도메인 이름을 거꾸로 적은 후에 프로젝트 이름 등을 붙여서 만들게 된다.

com.example.util 폴더에 Calculator을 실행해보자.

다른 패키지에서 Calculator 사용하기

위와 같이 main패키지에서도 Calculator에 정의된 메소드를 사용하고 싶으면,
Calculator을 import를 해야 한다.

여기서 주의할 점은import자체만으로는 메모리에 올라가지 않는다.

패키지 import 하기


위와 같은 구조가 있다고 했을때, CalculatorMain 클래스에서 util, util1에 있는 패키지에 있는 같은 이름의 클래스의 메소드를 사용한다고 하면 어떤 일이 발생할까.

이름이 같고, 패키지가 다른 클래스의 경우 객체 생성시에 패키지 경로를 입력하게 된다!

상속

~는 ~다. ~는 ~의 종류 중 하나이다. 라고 표현할 수 있다면 이것은 상속관계라고 말할 수 있습니다. 상속관계는 is a 관계 혹은 kind of 관계라고 하기도 한다.

전자제품은 켜다,끄다 라는 기능을 갖고 있고 이 기능을 TV, 전자레인지가 상속받는다!

상속 = 일반화 + 확장

상속이란 일반화와 확장이라는 개념을 합한 것이라고 생각하자. 부모클래스를 상속받는 것은 부모가 가지고 있는 것을 자식이 물려받아 사용 할 수 있다는 것을 의미한다.

상속을 쓰면 좋을 것일까?

위의 그림처럼 우리가 무엇을 만들때나, 어떤 기능을 볼 때 상속을 이용하면 매우 편리해 보인다!
하지만 제대로 사용하지 않으면, 결합도가 높아지기 때문에 이로 인해 재사용하기가 어려워진다.

따라서 상속은 제.대.로 알고 쓰도록 하자!

상속 선언 방법

[접근 제한자] [abstract | final] class 클래스명 extends 부모클래스명{
....
}

모든 클래스는 Object의 자손이다.

아무것도 상속받지 않으면 자동으로 java.lang.Object를 상속받는다.

좋은 웹페이지 즐겨찾기