라봉이의 개발 블로그

java의 정석 7강. 객체지향프로그래밍2(상) 본문

Java/Java의 정석 읽고 정리

java의 정석 7강. 객체지향프로그래밍2(상)

Labhong 2018. 5. 29. 17:43
반응형

객체지향은 c++과 유사한 점이 많으니 특징과 다른 점만 짚고 넘어가도록 하겠다.



1. 상속

1.1 상속의 정의와 장점


자바에서 상속을 구현하는 방법은 extends를 사용하면 된다.



1.2 단일 상속


다중 상속은 이름 겹침 등 다양한 문제가 있기 때문에 단일 상속만 허용하였다.

=> 다중 상속은 interface로 어느정도 대체 가능하다.



1.3 Object 클래스 - 모든 클래스의 조상


Object 클래스는 모든 클래스 상속 계층도의 제일 위에 위치하는 조상클래스이다.

다른 클래스로부터 상속 받지 않는 모든 클래스들은 자동적으로 Object 클래스로부터 상속받게 함으로써 이를 가능하게 한다.


Object 클래스에 대해서는 나중에 배우도록 하겠다.



2. 오버라이딩

2.1 오버로딩 vs 오버라이딩


  • 오버로딩: 기존에 없는 새로운 매서드를 정의하는 것

  • 오버라이딩: 상속받은 매서드의 내용을 변경하는 것


2.2 super


super는 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조변수이다.

this와 마찬가지로 상속받은 멤버와 자신의 클래스에 정의된 멤버의 이름이 같을 때는 super를 사용해서 구별할 수 있다.

class Parent{
    int x = 10;
}

class Child extends Parent {
    int x = 20;

    void method() {
        System.out.println("x= " + x);                  // Child의 x
        System.out.println("this.x= " + this.x);        // Child의 x
        System.out.println("super.x= " + super.x);      // Parent의 x
    }
}

public class Main {
    public static void main(String[] args) {
        Child c = new Child();
        c.method();
    }
}



2.3 super() - 조상 클래스의 생성자


this()와 마찬가지로 super() 역시 생성자이다.

super()는 조상 클래스의 생성자를 호출하는데 사용된다.


자손 클래스의 인스턴스를 생성하면 조상 클래스의 멤버의 생성과 초기화 작업이 수행되어야하기 때문에 자손 클래스의 생성자에서 조상 클래스의 생성자가 호출되어야 한다.

그리고 반드시 생성자의 첫 줄에서 조상클래스의 생성자를 호출해야한다.

만약 super를 쓰지 않으면 자동적으로 super()를 첫 줄에 추가한다.


Object를 제외한 모든 클래스의 생성자 첫 줄에는 생성자를 호출해야한다. (같은 클래스의 다른 생성자 혹은 조상의 생성자)

class Point {
    int x;
    int y;

    Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
    String getLocation() {
        return "x: " + x + ", y: " + y;
    }
}

class Point3D extends Point {
    int z;
    Point3D(int x, int y, int z) {
        super(x, y);                // 조상 클래스의 생성자
        this.z = z;
    }
    String getLocation() {
        return "x: " + x + ", y: " + y + ", z: " + z;
    }
}

public class Main {
    public static void main(String[] args) {
        Point3D p3 = new Point3D(1,2,3);
    }
}



3. package와 import

3.1 패키지(package)


패키지란, 클래스의 묶음이다. 패키지에는 클래스 또는 인터페이스를 포함 시킬 수 있으며, 서로 관련된 클래스들끼리 그룹 단위로 묶어 놓음으로써 클래스를 효율적으로 관리할 수 있다.


클래스가 물리적으로 하나의 클래스파일(*.class)인 것과 같이 패키지는 물리적으로 하나의 디렉토리이다.


정리:

  • 하나의 소스파일에는 첫 번째 문장으로 단 한 번의 패키지 선언만을 허용한다.

  • 모든 클래스는 반드시 하나의 패키지에 속해야한다.

  • 패키지점(.)을 구분자로 하여 계층구조로 구성할 수 있다.

  • 패키지는 물리적으로 클래스 파일(*.class)을 포함하는 하나의 디렉토리이다.



3.2 패키지의 선언

패키지를 선언하는 것은 간단하다. 클래스나 인터페이스의 소스파일(.java)에 다음과 같이 한 줄만 적어주면 된다.
package 패키지명;
  • 반드시 맨 처음 문장이어야 하며 하나의 소스파일에 단 한번만 선언될 수 있다.
  • 패키지 명은 소문자로 하는 것을 원칙으로 하고 있다.
  • 쓰지 않는 다면 자바에서 기본적으로 제공하는 '이름없는 패키지'가 선언된다. => 패키지를 지정하지 않는 모든 클래스들은 같은 패키지에 속하는 셈이다.


3.3 import문

소스코드를 작성할 때 다른 패키지의 클래스를 사용하려면 패키지명이 포함된 클래스 이름을 사용해야한다. 하지만, 매번 패키지명을 붙여서 작성하기란 여간 불편한 일이다.
따라서 클래스의 코드를 작성하기 전에 import문으로 사용하고자 하는 클래스의 패키지를 미리 명시해주면 소스코드에 사용되는 클래스이름에서 패키지명은 생략할 수 있다.


3.4 import문의 선언

import문은 package문 다음에, 그리고 클래스 선언 문 이전에 위치해야 한다.
일반적 순서)
1) package문
2) import문
3) 클래스 선언


4. 제어자
4.1 제어자란?

제어자는 클래스, 변수 또는 매서드의 선언부에 함께 사용되어 부가적인 의미를 부여한다.
  • 접근 제어자: public, protected, default, private
  • 그          외: static, final, abstract, native, transient, synchronized, volatile, strictfp


4.2 final - 마지막의, 변경될 수 없는

final은 변수에 사용되면 변경할 수 없는 상수가 되며, 매서드에 사용되면 오버라이딩을 할 수 없고 클래스에 사용되면 자신을 확장하는 자손클래스를 정의하지 못하게 된다.

  • 변수에 사용: 변수는 상수가 됌
  • 메서드에 사용: 오버라이딩을 할 수 없음
  • 클래스에 사용: 자손클래스를 정의하지 못하게 됌


4.3 생성자를 이용한 final 멤버변수 초기화

final이 붙은 인스턴스 변수생성자를 통해 초기화가 가능하다.
class Card {
  ...
  finanl int NUMBER;
  ...

  Card(int num, ...) {
    Number = num;
    ...
  }
  ...
}



4.5 abstract - 추상의, 미완성의


abstract미완성의 의미를 가지고 있다. 매서드의 선언부만 작성하고 실제 수행 내용은 구현하지 않은 추상매서드를 선언하는데 사용된다.

또한 클래스에 사용되어 클래스 내에 추상매서드가 존재한다는 것을 쉽게 알 수 있게 한다.


ex)

abstract class AbstractTest {   // 추상 클래스(추상매서드를 포함한 클래스)
  abstract void move();         // 추상 매서드(구현부가 없는 매서드)
}



4.6 접근 제어자(accesss modifier)


접근 제어자는 멤버 또는 클래스에 사용되어, 해당하는 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할을 한다.

public, protected, private은 c++과 동일하지만 default만 새로 존재한다.


접근 권한 표)

 제어자

같은 클래스 

같은 패키지 

자손 클래스 

전   체 

 public

 

 

 

 

 protected

 

 

 

 

 default

 

 

 

 

 private

 

 

 

 



4.7 접근 제어자를 이용한 캡슐화


클래스 내부에 선언된 데이터를 보호하기 위해 접근 제어자를 통해 캡슐화를 적용할 수 있다.



4.8 생성자의 접근 제어자


생성자에 접근 제어자를 사용함으로써 인스턴스의 생성을 제어할 수 있다.

생성자에 private을 지정하면 외부에서는 그와 같은 방식으로 생성을 할 수는 없지만 다른 생성자가 private으로 지정된 생성자를 이용할 수는 있다.

반응형
Comments