간단한 클래스 코드
클래스 선언 예
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
- 포인터 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에서는 불가능
'프로그래머 > Java Managed Programming' 카테고리의 다른 글
[개체지향 프로그래밍] 개체 모델링 | 클래스 다이어그램 | 유연성 | OOP (0) | 2021.02.13 |
---|---|
[개체지향 프로그래밍] 접근 제어자 | getter/setter | 캡슐화 | 추상화 (0) | 2021.02.07 |
[개체지향 프로그래밍] 개체 생성 | 가비지 콜렉터(garbage collector) | 생성자(constructor) (0) | 2021.02.07 |
[개체지향 프로그래밍] 개체지향 프로그래밍이란? | 개체지향 프로그래밍의 필요성 | 개체지향 프로그래밍 특성 (0) | 2021.01.17 |
[포프 tv 복습] Java 기본 문법, Java와 C,C#의 차이 (0) | 2021.01.10 |