<객체지향 프로그래밍> Chapter 04 클래스와 객체

2019. 4. 22. 14:18수업/Object-Oriented Programming

4.1 객체 지향과 자바

4.2 자바 클래스 만들기

4.3 생성자

4.4 객체 배열

4.5 메소드 활용

4.6 객체의 소멸과 가비지 컬렉션

4.7 접근 지정자

4.8 static 멤버

4.9 final


4.1 객체 지향과 자바

기본: 객체 지향 특성

final class Circle {
//4.9 final 클래스
    private int radius;         //4.7 접근 지정자 + 4.2 필드
    private String name;        //4.7 접근 지정자 + 4.2 필드
    private static int staticField;       //4.8 static 멤버변수(= 전역변수)
    public static final double PI = 3.14;
    //4.7 접근 지정자 //4.8 static멤버(= 전역변수) //4.9 final 필드(상수)

    Circle() {}    //4.3 디폴트 생성자 메소드(클래스 접근 지정자 따라감)
    Circle(int radius) {                  //4.3 생성자 메소드 오버로딩
        this(radius, "이름 없음");        //4.3 this() 생성자 호출
    }
    Circle(int radius, String name) {     //4.3 생성자 메소드 오버로딩
        this.radius = radius;    //4.3 this.멤버변수 radius = 매개변수 radius
        this.name = name;
    }

    void setRadius(int radius) {      //4.5 메소드 기본 타입 인자
        this.radius = radius;
    }
    void increase(Circle pizza) {    //4.5 메소드 레퍼런스 타입 인자
        pizza.radius++;
    }
    static void staticMethod() { staticField = 5; }
    //4.8 static 멤버함수(= 전역 함수)    //4.8 static멤버만 사용 가능

    final double getArea() {
    //4.9 final 메소드
        return PI * radius * radius;
    }
    void showInformation() {
        System.out.println(name + ": " + radius + "(반지름)" +
        "\nstatic필드: " + staticField);
    }
}

public class CircleArray {
//4.7 접근 지정자 //4.2 클래스 선언 //4.2 클래스 이름
    public static void main (String[] args) {
        Circle pizza;        //4.2 Circle 객체에 대한 레퍼런스 변수 pizza 선언
        pizza = new Circle(5, "피자");
    //4.2 Circle 객체 메모리 할당 + 객체 생성 + 생성자 코드 실행(필드 초기화)    
        Circle pizza2 = new Circle(5, "피자2");
    //4.2 Circle 객체 레퍼런스 변수 선언 및 객체 생성
        pizza2 = pizza;        //4.6 pizza2가 가리키던 객체는 가비지가 됨.

        Circle[] pizzaArray; //4.4 1단계: Circle 배열에 대한 레퍼런스 변수 선언
        pizzaArray = new Circle[5]; //4.4 2단계: 5개의 레퍼런스 변수 배열 생성
        for (int i=0; i<pizzaArray.length; i++)
            pizzaArray[i] = new Circle(i); //4.4 3단계: 배열의 각 객체 원소 생성

        pizza.setRadius(9);    //4.5 9가 메소드의 매개변수에 복사되어 전달
        pizza2.increase(pizza);
        //4.5 pizza에 저장된 레퍼런스 값이 매개변수에 복사되어 전달
        System.out.println(pizza.getArea());
        //4.5 pizza객체의 getArea()메소드 접근 및 호출하여 출력
        pizza.showInformation();
        for (int i=0; i<pizzaArray.length; i++)
            System.out.print((int)(pizzaArray[i].getArea()) + " ");
            //4.4 객체 배열의 원소에 접근하여 getArea()메소드 호출
        System.gc();    //4.6 가비지 컬렉션 강제 요청
    }
}


4.2 자바 클래스 만들기

  • 클래스: 객체를 만들어 내기 위한 설계도 or 틀
    접근 권한 + 클래스 선언 + 클래스명 { 필드 + 메소드(+생성자) }
  • 객체: 클래스 모양 그대로 생성된 실체 = 클래스의 인스턴스(instance)
    객체 레퍼런스 변수 선언 + 객체 메모리 할당 및 객체 생성(초기화)

4.3 생성자(constructor)

: 객체가 생성될 때 객체의 초기화를 위해 실행되는 메소드

  • 생성자는 리턴하지 않는다.

  • 생성자의 이름 = 클래스 이름

  • 매개변수의 개수와 타입을 다르게 해서 오버로딩 가능
    여러개(over) 메소드를 정의해서 클래스 내에 적재(loading)한다.

  • new를 통해 객체를 생성할 때 한 번만 호출되고 그 때 필드 초기화를 한다.

    • this: 현재 실행되고 있는 메소드가 속한 객체에 대한 레퍼런스
      필드(멤버 변수)와 매개 변수에 같은 이름을 붙일 때 사용

    • this(): 생성자가 다른 생성자를 호출할 때 사용
      생성자 코드 안, 첫 번째 문장에서 같은 클래스 내 다른 생성자 호출할 때만 사용

4.4 객체 배열

: 객체에 대한 레퍼런스를 원소로 갖는 배열

  • 배열 선언 및 생성
    배열에 대한 레퍼런스 선언 >> 레퍼런스 배열 생성 >> 객체 생성

4.5 메소드 활용(메소드 호출 시 인자 전달 / 오버로딩)

  • 인자 전달(argument passing): 값에 의한 호출(call-by-value) = 복사, 참조자 불가능

    • 매개변수: 기본 타입(boolean, byte, char, short, int, long, float, double)
      호출자가 건네는 값이 매개변수에 복사되어 전달
    • 매개변수: 객체 or 배열
      객체 or 배열의 레퍼런스 값이 매개변수에 복사되어 전달

  • 메소드 오버로딩(method overloading) = 메소드 중복
    접근 지정자, 리턴 타입에 상관없이
    매개변수의 개수 or 타입이 다르면 이름만 같은 서로 다른 메소드가 된다.

4.6 객체의 소멸과 가비지 컬렉션

  • 객체 소멸: new에 의해 생성된 객체 공간을 자바 가상 기계에게 돌려주어
    가용 메모리(available memory)에 포함시키는 것

  • 가비지(garbage)
    자바 응용프로그램에서 더 이상 사용되지 않게 된 객체나 배열 메모리
    (참조하는 레퍼런스가 하나도 없는 객체나 배열)

  • 가비지 컬렉션(garbage collection): 강제 요청만 가능 무조건 작동은 불가능
    자바 플랫폼이 가용 메모리가 일정 크기 이하로 줄어들었을 때 자동으로 가비지를 회수하여 가용 메모리를 늘리는 것
    가비지 컬렉션 스레드(garbage collection thread)에 의해 처리

4.7 접근 지정자(access specifier)

: 클래스나 멤버들을 다른 클래스에서 접근해도 되는지의 여부를 선언하는 지시어
(private, 디폴트, protected, public)
필드는 private, 클래스는 디폴트로 일단 작성하고 필요할 때만 범위를 넓혀나갈 것

  • 클래스 접근 지정

    • public 클래스
      패키지에 상관없이 다른 어떤 클래스에게도 사용이 허용
    • 디폴트 클래스(접근 지정자 생략)
      같은 패키지 내의 클래스들에게만 사용이 허용

  • 멤버 접근 지정

    • public 멤버
      모든 클래스들이 접근 허용
    • 디폴트 멤버(default or package-private)
      같은 패키지 내의 클래스들에게만 접근 허용
    • protected 멤버
      같은 패키지 or 자식 클래스들에게 접근 허용
    • private 멤버
      클래스 내의 멤버들에게만 접근 허용

4.8 static 멤버

  • static 멤버(클래스 멤버): 전역 변수(or 함수), 공유 멤버 만들 때 활용

    • 클래스당 하나 있는 공간(클래스 코드가 적재되는 메모리)에 따로 저장
    • 클래스 로딩 시에 멤버 생성(객체와 무관), 프로그램 종료 시 사라짐
    • 모든 객체들에 의해 공유
    • 접근 방법: 클래스명.static멤버
      (객체명.static멤버 도 가능하지만 지양할 것)
    • static 메소드는 static 멤버만 접근 가능

  • non-static 멤버(인스턴스 멤버)

    • 객체마다 있는 공간에 저장
    • 객체 생성 시에 멤버 생성, 객체가 사라질 때 사라짐
    • 각각 객체 내에 공간 유지(공유 X)
    • 접근 방법: 객체 레퍼런스명.static멤버

4.9 final

  • final 클래스: 클래스를 상속받을 수 없음을 지정
  • final 메소드: 오버라이딩할 수 없는 메소드임을 선언
  • final 필드: 상수임을 선언(한 번 초기화되면 값 변경 불가)