[자바] java 인스턴스
05. 인스턴스 생성과 힙 메모리 (heap memory)
인스턴스 (instance)
-
클래스는 객체의 속성을 정의 하고, 기능을 구현하여 만들어 놓은 코드 상태
-
실제 클래스 기반으로 생성된 객체(인스턴스)는 각각 다른 멤버 변수 값을 가지게 됨
가령, 학생의 클래스에서 생성된 각각의 인스턴스는 각각 다른 이름, 학번, 학년등의 값을 가지게 됨
-
new 키워드를 사용하여 인스턴스 생성 ->동적 메모리에 생성. c++은 delete, c에선 free로 제거.
힙 메모리
-
생성된 인스턴스는 동적 메모리(heap memory) 에 할당됨
-
C나 C++ 언어에서는 사용한 동적 메모리를 프로그래머가 해제 시켜야 함 ( free() 난 delete 이용)
-
자바에서 Gabage Collector 가 주기 적으로 사용하지 않늠 메모리를 수거
-
하나의 클래스로 부터 여러개의 인스턴스가 생성되고 각각 다른 메모리 주소를 가지게 됨
참조 변수, 참조 값
package ch04;
public class StudentTest {
public static void main(String[] args) {
Student studentLee = new Student();
studentLee.studentName = "이순신";
studentLee.address = "서울";
studentLee.showStudentInfo();
Student studentKim = new Student();
studentKim.studentName = "김유신";
studentKim.address = "경주";
studentKim.showStudentInfo();
System.out.println(studentLee);
System.out.println(studentKim);
}
}

여기서 저 밑의 부분은 앞은 패키지 이름과 클래스 이름(클래스 풀네임 그 뒤는 주소값.(레퍼런스 밸류) 쟤가 가리키는 건 스튜던트가 가리키는 주소 의미.)
용어 정리
객체 : 객체 지향 프로그램의 대상, 생성된 인스턴스
클래스 : 객체를 프로그래밍 하기위해 코드로 정의해 놓은 상태
인스턴스 : new 키워드를 사용하여 클래스를 메모리에 생성한 상태
멤버 변수 : 클래스의 속성, 특성
메서드 : 멤버 변수를 이용하여 클래스의 기능을 구현한 함수
참조 변수 : 메모리에 생성된 인스턴스를 가리키는 변수
참조 값 : 생성된 인스턴스의 메모리 주소 값
06. 생성자에 대해 알아봅시다 (constructor)
생성자
- 생성자 기본 문법
<modifier><class_name>([<argument_list])
{
[<statements]
}
Student lee = new Student 에서 new 뒤가 생성자, lee가 인스턴스
primtive 제외한 객체는 전부 생성자를 사용해야 한ㄷ.
-
객체를 생성할 때 new 키워드와 함께 사용 - new Student();
-
생성자는 일반 함수처럼 기능을 호출하는 것이 아니고 객체를 생성하기 위해 new 와 함께 호출 됨
-
객체가 생성될 때 변수나 상수를 초기화 하거나 다른 초기화 기능을 수행하는 메서드를 호출 함
-
생성자는 반환 값이 없고, 클래스의 이름과 동일
-
대부분의 생성자는 외부에서 접근 가능하지만, 필요에 의해 private 으로 선언되는 경우도 있음
기본 생성자 (default constructor)
-
클래스에는 반드시 적어도 하나 이상의 생성자가 존재
-
클래스에 생성자를 구현하지 않아도 new 키워드와 함께 생성자를 호출할 수 있음
-
클래스에 생성자가 하나도 없는 경우 컴파일러가 생성자 코드를 넣어 줌
public Student(){}
-
매개 변수가 없음, 구현부가 없음
생성자 만들기
- 컴파일러가 제공해 주는 기본 생성자외에 필요에 의해 생성자를 직접 구현 할 수 있음
Student.java
public class Student {
public int studentNumber;
public String studentName;
public int grade;
public Student(int studentNumber, String studentName, int grade) {
this.studentNumber = studentNumber;
this.studentName = studentName;
this.grade = grade;
}
public String showStudentInfo() {
return studentName + "학생의 학번은 " + studentNumber + "이고, " + grade + "학년 입니다.";
}
}
StudentTest.java
public class StudentTest {
public static void main(String[] args) {
//Student studentLee = new Student();
Student studentLee = new Student(12345, "Lee", 3);
String data = studentLee.showStudentInfo();
System.out.println(data);
}
}
07. 여러가지 생성자를 정의하는 생성자 오버로딩 (overloading)
생성자 정의 하기
-
생성자를 구현해서 사용할 수 있음
-
클래스에 생성자를 따로 구현하면 기본 생성자 (default constructor)는 제공되지 않음
-
생성자를 호출하는 코드(client 코드)에서 여러 생성자 중 필요에 따라 호출해서 사용할 수 있음
UserInfo.java
public class UserInfo {
public String userId;
public String userPassWord;
public String userName;
public String userAddress;
public String phoneNumber;
public UserInfo(){}
public UserInfo(String userId, String userPassWord, String userName) {
this.userId = userId;
this.userPassWord = userPassWord;
this.userName = userName;
}
public String showUserInfo() {
return "고객님의 아이디는 " + userId + "이고, 등록된 이름은 " + userName + "입니다.";
}
}
UserInfoTest.java
public class UserInfoTest {
public static void main(String[] args) {
UserInfo userLee = new UserInfo();
userLee.userId = "a12345";
userLee.userPassWord = "zxcvbn12345";
userLee.userName = "Lee";
userLee.phoneNumber = "01034556699";
userLee.userAddress = "Seoul, Korea";
System.out.println(userLee.showUserInfo());
UserInfo userKim = new UserInfo("b12345", "09876mnbvc", "Kim");
System.out.println(userKim.showUserInfo());
}
}
08. 복습해봅시다 (객체 구현하기)
다음 설명에 해당되는 객체를 구현하고 해당 정보를 출력해 보세요
-
키가 180 이고 몸무게가 78 킬로인 남성이 있습니다. 이름은 Tomas 이고 나이는 37세입니다.
-
음식점에 배달 주문이 들어왔습니다.
주문 접수 번호 : 202011020003 주문 핸드폰 번호 : 01023450001 주문 집 주소 : 서울시 강남구 역삼동 111-333 주문 날짜 : 20201102 주문 시간 : 130258 주문 가격 : 35000 메뉴 번호 : 0003
09. 참조 자료형 변수
참조 자료형
- 변수의 자료형

-
클래스형으로 변수를 선언
-
기본 자료형은 사용하는 메모리의 크기가 정해져 있지만, 참조 자료형은 클래스에 따라 다름
-
참조 자료형을 사용 할때는 해당 변수에 대해 생성하여야 함
(String 클래스는 예외적으로 생성하지 않고 사용할 수 있음)
참조 자료형 정의하여 사용하기
-
학생이 수강한 과목들에 대한 성적을 산출하기 위한 경우 학생 클래스 속성에 과목이 모두 있으면 불합리
-
학생(Student)과 과목(Subject)에 대한 클래스를 분리하여 사용하고 Subject 클래스를 활용하여 수강한 과목들의 변수의 타입으로 선언

- 선언된 Subject 변수는 생성된 인스턴스가 아니므로, Student의 생성자에서 생성하여 사용
Student.java
package ch09;
public class Student {
int studentID;
String studentName;
Subject korea;
Subject math;
public Student(int id, String name) {
studentID = id;
studentName = name;
/*
this.id = id;
this.name = name;
*/
korea = new Subject();
math = new Subject();
}
public void setKoreaSubject(String name, int score) {
korea.subjectName = name;
korea.score = score;
}
public void setMathSubject(String name, int score) {
math.subjectName = name;
math.score = score;
}
public void showStudentSocre() {
int total = korea.score + math.score;
System.out.println(studentName + " 학생의 총점은 " + total + "점 입니다." );
}
}
Subject.java
package ch09;
public class Subject {
String subjectName;
int score;
int subjectID;
}
StudentTest.java
package ch09;
public class StudentTest {
public static void main(String[] args) {
Student studentLee = new Student(100, "Lee");
studentLee.setKoreaSubject("국어", 100);
studentLee.setMathSubject("수학", 95);
Student studentKim = new Student(101, "Kim");
studentKim.setKoreaSubject("국어", 80);
studentKim.setMathSubject("수학", 99);
studentLee.showStudentSocre();
studentKim.showStudentSocre();
}
}
10. 접근 제어 지시자(access modifier)와 정보은닉(infomation hiding)
접근 제어 지시자 (accesss modifier)
-
클래스 외부에서 클래스의 멤버 변수, 메서드, 생성자를 사용할 수 있는지 여부를 지정하는 키워드
-
private : 같은 클래스 내부에서만 접근 가능 ( 외부 클래스, 상속 관계의 클래스에서도 접근 불가)
-
아무것도 없음 (default) : 같은 패키지 내부에서만 접근 가능 ( 상속 관계라도 패키지가 다르면 접근 불가)
-
protected : 같은 패키지나 상속관계의 클래스에서 접근 가능하고 그 외 외부에서는 접근 할 수 없음
-
public : 클래스의 외부 어디서나 접근 할 수 있음
get()/ set() 메서드
-
private 으로 선언된 멤버 변수 (필드)에 대해 접근, 수정할 수 있는 메서드를 public으로 제공
-
get() 메서드만 제공 되는 경우 read-only 필드
-
이클립스에서 자동으로 생성됨
정보 은닉
- private으로 제어한 멤버 변수도 public 메서드가 제공되면 접근 가능하지만 변수가 public으로 공개되었을 때보다
private 일때 각 변수에 대한 제한을 public 메서드에서 제어 할 수 있다. 사실 정보 은닉이라기 보다 정보 보호에 더 가까울 수도.
public void setMonth(int month) {
if ( month < 1 || month > 12) {
isValid = false;
}
else {
this.month = month;
}
}
- 객체 지향 프로그램에서 정보 은닉은 필요한 외부에서 접근 가능한 최소한의 정보를 오픈함으로써 객체의 오류를 방지하 클라이언트 객체가 더 효율적으로 객체를 활용할 수 있도록 해준다.