✍️ Class 실습
Book 클래스(설계도)
public class Book {
public String title; //String : 문자열을 저장하는 자료형
public int price;
public String publisher;
public String author;
public int page;
}
Book book;
변수 book은 클래스의 객체이다. 서술한 것처럼 객체도 하나의 변수로 한 개의 데이터만 저장할 수 있다.
book 자체는 한 개의 데이터만 저장할 수 있음에도 불구하고 book은 title, price, publisher, author, page에 대한 데이터를 모두 포함해야 한다. 이게 어떻게 가능할까?
실제로 title, price, publisher, author, page에 대한 정보는 메모리상 어딘가에 저장되어 있고 book은 그 메모리 주소 담고 있는 일종의 레퍼런스이다.
🍊 new 키워드
title, price, publisher, author, page에 대한 정보는 메모리상 어딘가에 있고 book은 그곳을 가리킨다.
이제 조금 더 의문을 가져보자.
Book book;
다음과 같이 변수 book을 선언만 해도 title, price, publisher, author, page을 위한 메모리 공간이 할당될까? 그렇지 않다.
클래스의 객체를 선언만 하면 실제 속성과 메서드가 할당될 메모리 공간을 가리킬 준비만 된 상태이고 실제 book을 이루는 데이터들의 메모리 공간이 할당되진 않는다.
코드를 작성해 보면 book의 price에 10을 할당하려 하면 에러가 발생한다.
public static void main(String[] args) {
Book book;
book.price = 10; // error!
}
여기서 모든 문제를 해결할 개념이 바로 new 키워드로, 객체에 실제 메모리를 할당할 때 new를 사용한다.
public static void main(String[] args) {
Book book;
book = new Book();
book.price = 10; // OK!!
}
new 키워드로 실제 메모리 공간을 할당하면 그 순간부터 book을 Book 클래스의 '인스턴스'라고 부를 수 있다.
코드상의 변화를 알아보면, new 키워드로 book이 가리킬 메모리 공간을 할당하면 book에 .을 붙여 속성값을 가져오거나 새로운 값을 할당할 수 있는 멋진 일이 발생한다.
public static void main(String[] args) {
Book book;
book = new Book();
book.title = "demian";
book.price = 2000;
book.publisher = "hello";
book.author = "word";
book.page = 123;
System.out.println(book.title);
System.out.println(book.price);
System.out.println(book.publisher);
System.out.println(book.author);
System.out.println(book.page);
}
// 출력
demian
2000
hello
word
123
🤔 실습, Person 클래스 만들기
Person 클래스를 만들고 new 키워드를 사용해서 실제 객체에 메모리를 할당하고 원하는 값을 넣고 출력한다.
조건 1) Person 클래스의 속성은 이름(name), 나이(age), 키(height), 몸무게(weight)로 정의한다.
조건 2) 키와 몸무게 같은 실수형 데이터는 기본 자료형인 dobule로 선언한다.
public static void main(String[] args) {
Person person = new Person();
person.name = "침착맨";
person.age = 20;
person.height = 179.9;
person.weight = 70.4;
System.out.println(person.name);
System.out.println(person.age);
System.out.println(person.height);
System.out.println(person.weight);
}
// 출력
침착맨
20
179.9
70.4
'Java > Java' 카테고리의 다른 글
[Java] 쓰레드 로컬 (ThreadLocal) (0) | 2022.08.26 |
---|---|
[Java] 어노테이션(Annotation), @ (0) | 2022.08.23 |
[Java] Chapter 1-4. Java의 Class, 사용자 정의 자료형 (0) | 2022.01.24 |
[Java] Chapter 1-3. 프로그래밍의 3대 요소(변수, 자료형, 할당) (0) | 2022.01.24 |
[Java] Chapter 1-2. 자바의 구동방식(JVM) (0) | 2022.01.23 |