자바 프로그래밍 입문#6

파핑·2022년 3월 15일
0

JAVA PROGRAMMING

목록 보기
7/12

자바 공부기록 6일차


-new예약어로 클래스 생성하기

클래스를 만들고 실행하는 과정을 살펴보자. 클래스를 사용하려면 먼저 클래스를 생성해야 한다. 클래스를 생성하는 코드는 다음과 같다.

자바에서 클래스를 생성할 때는 new예약어를 사용하고 이어서 생성자를 써 준다. 클래스 자료형 변수를 선언하고 new예약어로 생성자를 호출하여 대입하면 새로운 클래스가 생성된다.
이것을 인스턴스라고 부른다. 그리고 인스턴스를 가리키는 클래스형 변수참조변수라고 한다.

✍잠깐 메모
-인스턴스와 참조변수는 둘이 같다고 생각해야 할지 정확하게 이해하기 어렵다.
일단 이렇게 기억해보자.
인스턴스 : 클래스가 생성된 공간 또는 생성되는 것.
참조변수 : 그 공간과 공간에 들어있는 것을 가리키는 말.

위에서 배운 코드를 써보자.

Student ㅤstudnetAhn = new Student( );
ㅤ**클래스  ㅤ변수이름ㅤㅤㅤㅤ생성자**

코드를 자세히 살펴보자.
위 코드는 Student클래스 자료형으로 studentAhn 변수를 선언하고 new Student( ); 로 Student클래스를 생성하여 studentAhn에 대입한다는 뜻이다. 이때 studentAhn을 참조변수라고 하고, 이 변수가 생성된 인스턴스를 가리킨다.

인스턴스를 여러개 생성해 보자.

ㅤpublic static void main(String[ ]args) {
ㅤStudent student1 = new Student( ); **//첫번째 학생**
ㅤStudent1.studentName = "안치즈";
ㅤSystem.out.println(student1.getStudentName( ));

ㅤStudent student2 = new Student( ); **//두번째 학생**
ㅤStudent2.studentName = "안딸기";
ㅤSystem.out.println(student2.getStudentName( ));
ㅤ}
}

생성자를 두 번 사용해 서로 다른 변수 이름으로 클래스를 생성하였다. 즉 서로 다른 인스턴스가 두개 생성된 것이다.
그럼 이 인스턴스를 어디에 어떻게 사용할 수 있을까?

①참조변수 사용하기
인스턴스의 멤버변수와 메서드를 참조하여 참조변수를 사용할 수 있다. 이때 도트연산자를 사용해 코드를 짠다.
studentAhn 참조변수로 studentNaem 멤버 변수에 이름을 저장하고 getStudentName(ㅤ)메서드를 사용해보자.

studnetAhn.studentName = "안치즈"; 
//멤버변수사용

System.out.println(studentAhn.getStudentName(ㅤ ));
//메서드 사용

ㅤㅤ
이제 인스턴스가 생성되는 과정을 더 자세히 살펴보자.

인스턴스와 힙 메모리

new Student(ㅤ)를 선언하면 Student 하나가 생성된다. 이 Student 는 studentID, studnetName 등 멤버변수를 가지고 있다. 이 변수들을 저장하는 공간이 바로 힙 메모리이다. 클래스 생성자를 하나 호출하면 인스턴스가 힙 메모리에 생성되는 것이다.

Student studnetAhn = new Student( );

위와 같이 생성된 클래스를 studnetAhn변수에 대입하면 인스턴스가 저장된 메모리를 studentAhn 변수가 가리키게된다.
위 코드에서 studentAhn 변수는 지역변수이다. 지역변수는 스택메모리에 인스턴스는 힙 메모리에 생성된다.
지역변수 studentAhn생성된 인스턴스를 대입하는 것은 studentAhn에 인스턴스가 생성된 힙 메모리의 주소를 대입한다는 것이다.

✍잠깐 메모
-Student studentAhn = new Studnet( ); 에서 Student(클래스) 와 studnetAhn(참조변수)이렇게 두개가 있다면 studnetAhn(참조변수)에 Student(클래스)를 넣어 새로운 Studnet들을 생성해 내면 이 안에 멤버변수들이 똑같이 복사 될것이고 Student객체가 여러개로 복사되는 것이라 생각된다.
그 다음에 studnetAhn.studentName = "안치즈"; 는 studentAhn(참조변수)에 Student의 멤버변수 중 하나인 studentName에 "안치즈"라는 이름을 저장한다.
System.out.println(studentAhn.getStudentName(ㅤ ));
get( )메서드를 이용하여 저장한 이름을 가져와 출력하는 것이다. system.out.println( );에 괄호안에 들어간studentAhn.getStudentName가 "안치즈"가 저장된 경로? 주소라고 생각하여 기억하면 좋을것 같다.

그럼 다음 인스턴스 두개를 살펴보자.

Student student1 = new Student( );
Student student2 = new Student( );

위 생성된 인스턴스 두개는 각각 다른 메모리 공간을 차지한다. student1, studentName 과 student2,studentName은 서로 다른 값을 가진다.

✍잠깐 메모
2칸으로 된 기차가 있다고 생각해보자. 1호차인 스택메모리 칸 안에는 1-1번 좌석에 student1과 1-2번 좌석에 student2변수가 타고 있다. 2호차인 힙메모리 칸에는 studet1의 동생인 Student가 2-1번 좌석에, student2의 동생인 Student가 2-2번 좌석에 타고 있다. 이 둘은 동명이인 이지만 서로 전혀 관계가 없다.

클래스가 생성될 때마다 인스턴스는 다른 메모리 공간을 차지한다. 다시말해 멤버변수를 저장하는 공간이 매번 따로 생긴다는 의미이다.
이런 이유로 클래스에 선언한 멤버변수를 다른 말로 '인스턴스 변수'라고도 부른다.

생성자

생성자에 대해 알아보자.

-생성자 만들기

public class Person {
ㅤString name;
ㅤfloat height;
ㅤfloat weight;
}

-생성자 테스트하기

public class PersonTest {
ㅤpublic static void main(String[ ]args) {
ㅤPerson preson = new **Person( );** **//생성자**
ㅤ}
}

위 예제를 살펴보자.
자바에서 클래스를 생성할 때 사용하는 person( )같은 함수를 생성자라고 한다.
클래스의 멤버 변수는 메서드에 의해 값이 변경될 수도 있지만, 처음 클래스를 생성할 때 값을 정해야 하는 경우도 있다. 생성자가 하는 일은 클래스를 처음 만들 때 멤버 변수나 상수를 초기화 하는 것이다.

✍잠깐 메모
개인적으로 초기화라고 하면 다 삭제한다라는 느낌이 강해 나는 초기화=선언한다. 라고 이해하였다.
즉 생성자는 클래스를 처음 만들 때 멤버 변수나 상수를 선언하는 것이다.

디폴트 생성자

생성자는 클래스를 생성할 때만 호출한다. 생성자 이름은 클래스 이름과 같고, 생성자는 반환값이 없다.

그런데 '생성자 만들기'의 Person클래스 코드를 살펴보면 Person( )생성자가 따로 없다. 앞에서 만든 Student 클래스도 생성자가 따로 없었다.
그래도 new Student( )를 사용해서 객체를 만들 수 있었다. 왜일까?
생성자가 없는 클래스는 클래스 파일을 컴파일할 때 자동으로 자바컴파일러가 생성자를 만들어준다. 이렇게 자동으로 만들어 주는 생성자를 디폴트생성자(default constructor)라고 한다.


profile
html/css공부 중(JAVA잠시 접어두는 중)

1개의 댓글

comment-user-thumbnail
2022년 3월 16일

이해 안 되는 부분을 글 중간중간 정리한건 정말 좋은 방법이라고 개인적으로 생각합니다 ㅎㅎ

보편적으로 클래스의 멤버변수는 private으로 외부로부터 숨기고, public 메서드를 통해 멤버변수에 접근하도록 구성해요 ㅎㅎ (인스턴스 변수라고 표현하는게 더 정확할 것 같네요)

흔히 볼 수 있는 예는, setter, getter입니다. 물론 Setter와 Getter는 형식적으로 존재하는 느낌이 강하지만, 객체지향의 캡슐화를 따르기 위해 존재한다고 이해하시면 좋을 것 같습니다.

답글 달기