본문 바로가기

프로그래머/Java Managed Programming

[개체지향 프로그래밍] 클래스(class) | 접근 제어자(public, private) | 인스턴스(instance)

간단한 클래스 코드


클래스 선언 예

public class HUman{
    public String name;
    public int age;
    public Sex esx;

    public void walk() {
        this.age += 1;
    }

    public void eat() {
        this.age -= 1;
    }

    public void speak() {
        System.out.printIn("hello friend");
    }
}

접근 제어자 public

  • 멤버 변수

    public <자료형> <변수명>;
  • 멤버 함수

    public <반환형> <함수명>(<매개변수 목록>) {...}
  • 멤버 변수와 멤버 함수 선언 시 앞에 붙는 접근 제어자

  • 외부에서 클래스 내부에 담긴 상태/동작에 접근하는 것을 허용

    • 여기서 외부는 다른 패키지를 의미

몇 가지 용어 정리

상태를 칭하는 용어

  • 멤버 변수(member variable)
  • 필트(field)
  • 속성(attribute)

동작을 칭하는 용어

  • 멤버 함수(member function)
  • 메서드(method)
  • 메시지(message)

힙에 새로운 개체 만들기

  • C
    human_t* adam = (human_t*)malloc(sizeof(human_t));
    human_t* fiona = (human_t*)malloc(sizeof(human_t));
Human adam = new Human();
Human fiona = new Human();
  • adam과 fiona는 개체
  • 이 둘은 Human 클래스에 속해 있음

인스턴스(instance)

  • 개체를 부르는 또 다른 표현
  • 인스턴스의 뜻은 사례
  • '어떤 클래스에 속하는 개체의 한 예'라는 의미
  • 인스턴스화(instantiation): 클래스로부터 개체 하나를 만드는 행위

개체의 멤버 변수에 접근하기

C

human_t* adam = (human_t*)malloc(sizeof(human_t));

printf("Adam's age is now %d\n", adam->age);    // 52685

adam->sex = MALE;
adam->name = "Adam";
adam->age = 20;

printf("Adam's age is now %d\n", adam->age);    // 20

Java

Human adam = new Hukman();

System.out.printf("Adam's age is now %d%s", adam.age, NEW_LINE);    // 0

adam.sex = Sex.MALE;
adam.name = "Adam";
adam.age = 20;

System.out.printf("Adam's age is now %d%s", adam.age, NEW_LINE);    // 20
  1. 포인터 vs 참조형
Human adam;
  • 자료형: 사실상 포인터
  • 포인터? 메모리를 저장하는 변수
  • adam 역시 힙에 위치한 Human 개체의 주소를 담고 있는 변수
  • 자바에서는 이것을 참조형(reference type)이라고 함
  • 자바는 기본 자료형을 제외하면 모두 포인터
  • 자바에는 포인터가 없다는 것은 거짓말
    • 포인터 연산이 불가능할 뿐
human_t* adam = (human_t*)malloc(sizeof(human_t));

adam += 1;      // OK
Human adam = new Human();

adam += 1;      // 컴파일 오류
  • C는 개체를 포인터 혹은 값으로 둘 다 전달 가능
  • Java는 포인터로만 전달 가능

C의 경우

void increase_age(human_t player, int age) {
    player.age += age;
    age = 0;
}   // 원본이 바뀌지 x

void increase_age_ref(human_t* player, int* age) {
    player.age += *age;
    *age = 0;
}   // 원본이 바뀜
int age = 10;
human_t* adam = (human_t*)malloc(sizeof(human_t));

increase_age(*adam, age);
increase_agke_ref(adam, &age);

free(adam);

Java의 경우

public void increaseAge(Human player, int age){
    player.age += age;
    age = 0;
}   // Human -> 원본이 바뀜, int -> 원본은 바뀌지 않음
void increaseAgeRef(Human* player, int* age){ ... } // 컴파일 오류
int age = 10;
Human adam = new Human();   // adam.age: 20
increaseAge(adam, age);     // adam.age: 30, age: 10
  • java에서는 참조형과 값형 변수 선언이 똑같아 보여 헷갈릴 수 있음
  • C에서는 가능한 swap이 java에서는 불가능