반응형
5. 인스턴스 생성과 힙 메모리 ( Heap Memory )
인스턴스 ( instance )
- 클래스는 객체의 속성을 정의하고, 기능을 구현하여 만들어 놓은 코드 상태
- 실제 클래스 기반으로 생성된 객체는 각각 다른 멤버 변수 값을 가지게 됨
가령 학생 클래스에서 생성된 각각의 인스턴스는 각각 다른 이름, 학번 학년등의 값을 가지게 됨
힙 메모리
- 생성된 인스턴스는 동적 메모리 ( heap memory )에 할당됨
- C나 C++ 언어 에서는 사용한 동적 메모리를 프로그래머가 해제 시켜야 함
- 자바에서 Gabage Collector 가 주기적으로 사용하지 않는 메모리를 수거
- 하나의 클래스로 부터 여러개의 인스턴스가 생성되고, 각각 다른 메모리 주소를 가지게 됨.
참조 변수, 참조 값
Student studentLee = new Student();
studentLee.setStudentName("Lee");
System.out.println(studentLee); // ch04.Student@참조 값
용어 정리
- 객체 : 객체 지향 프로그램의 대상, 생성된 인스턴스
- 클래스 : 객체를 프로그래밍 하기위해 코드로 정의해 놓은 상태
- 인스턴스 : new 키워드를 사용하며 클래스를 메모리에 생성한 상태
- 멤버 변수 : 클래스의 속성, 특성
- 메서드 : 멤버 변수를 이용하여 클래스의 기능을 구현한 함수
- 참조 변수 : 메모리에 생성된 인스턴스를 가르키는 변수
- 참조 값 : 생성된 인스턴스의 메모리 주소 값
6. 생성자 ( Constructor ) 란?
생성자
- 생성자 기본 문법 <class_name>([<argument_list]) { [<statements] }
- 객체를 생성할 때 new 키워드와 함께 사용 - new Student();
- 생성자는 일반 함수처럼 기능을 호출하는 것이 아니고 객체를 생성하기 위해 new와 함께 호출 됨
- 객체가 생성될 때 변수나 상수를 초기화 하거나 다른 초기화 기능을 수행하는 메서드를 호출 함
- 생성자는 반환 값이 없고, 클래스의 이름과 동일
- 대부분의 생성자는 외부에서 접근 가능하지만, 필요에 의해 private로 선언되는 경우도 있음
기본 생성자 ( default constructor )
- 클래스에는 반드시 적어도 하나 이상의 생성자가 존재
- 클래스에 생성자를 구현하지 않아도 new 키워드와 함께 생성자를 호출할 수 있ㅇ므
- 클래스에 생성자가 하나도 없는 경우 컴파일러가 생성자 코드를 넣어준다
ex) public Student(){
} - 매개 변수가 없음, 구현부가 없음
생성자 만들기
- 컴파일러가 제공해 주는 기본 생성자 외에 필요에 의해 생성자를 직접 구현할 수 있음
public class Student {
public int studentNumber;
public String studentName;
public int grade;
public Student() {}
public Student(int studentNumber, String studentName, int grade) {
this.studentName = studentName;
this.studentNumber = studentNumber;
this.grade = grade;
}
public String showStudentInfo() {
return studentName + "학생의 학번은 " + studentNumber + "이고 학년은 " + grade + "입니다.";
}
}
public class StudentTest {
public static void main(String[] args) {
Student studentlee = new Student();
System.out.println(studentlee.showStudentInfo());
//null학생의 학번은 0이고 학년은 0입니다.
Student studentKim = new Student(123456, "Kim", 3);
System.out.println(studentKim.showStudentInfo());
// Kim학생의 학번은 123456이고 학년은 3입니다.
}
}
7. 오버로딩 ( overloading )
생성자 정의하기
- 생성자를 구현해서 사용할 수 있음
- 클래스에 생성자를 따로 구현하면 기본 생성자는 제공되지 않음
- 생성자를 호출하는 코드(client 코드)에서 여러 생성자 중 필요에 따라 호출해서 사용할 수 있음
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.userName = userName;
this.userPassWord = userPassword;
}
public String showUserInfo() {
return "고객님의 ID는 " + userId + " 이고, 등록된 이름은 " + userName + "입니다.";
}
}
public class UserInfoTest {
public static void main(String[] args) {
UserInfo userLee = new UserInfo();
userLee.userId = "Lee1234";
userLee.userPassWord = "asdfzxcv";
userLee.userName = "Lee";
userLee.phoneNumber = "01012345678";
userLee.userAddress = "Seoul, Koera";
System.out.println(userLee.showUserInfo());
//고객님의 ID는 Lee1234 이고, 등록된 이름은 Lee입니다.
UserInfo userKim = new UserInfo("Kim1234", "qwerasdf", "Kim");
System.out.println(userKim.showUserInfo());
//고객님의 ID는 Kim1234 이고, 등록된 이름은 Kim입니다.
}
}
연습문제
ClassTestInfo.java
public class ClassTestInfo {
public int orderNumber;
public String orderPhone;
public String orderAdderess;
public String orderDate;
public String orderTime;
public int orderPrice;
public int menuNumber;
public String showOrderInfo() {
return "주문 접수번호 : " + orderNumber + "\n" +
"주문 핸드폰 번호 : " + orderPhone + "\n" +
"주문 집 주소 : " + orderAdderess + "\n" +
"주문 날짜 : " + orderDate + "\n" +
"주문 시간 : " + orderTime + "\n" +
"주문 가격 : " + orderPrice + "\n" +
"메뉴 번호 : " + menuNumber;
}
public String height;
public String weight;
public String name;
public String age;
public String showManInfo() {
return "키가" + height + " 이고 몸무게가" + weight + "인 남성이 있습니다. 이름은" + name + "이고, 나이는" + age + " 입니다.";
}
}
ClassTestInfoTest.java
public class ClassTestInfoTest {
public static void main(String[] args) {
ClassTestInfo orderInfo = new ClassTestInfo();
orderInfo.orderNumber = 12345;
orderInfo.orderPhone = "010234567";
orderInfo.orderAdderess = "서울특별시 중랑구";
orderInfo.orderDate = "221108";
orderInfo.orderTime = "180323";
orderInfo.orderPrice = 12500;
orderInfo.menuNumber = 10300;
System.out.println(orderInfo.showOrderInfo());
ClassTestInfo manInfo = new ClassTestInfo();
manInfo.height = "180";
manInfo.weight = "78";
manInfo.name = "Tomas";
manInfo.age = "37";
System.out.println(manInfo.showManInfo());
}
}
9. 참조 자료형 변수
참조 자료형
변수의 자료형
- 클래스형으로 변수를 선언
- 기본 자료형은 사용하는 메모리의 크기가 정해져 있지만, 참조 자료형은 클래스에 따라 다름
- 참조 자료형을 사용할 때는 해당 변수에 대해 생성하여야 함
(String 클래스는 예외적으로 생성하지 않고 사용 가능)
참조 자료형 정의하여 사용하기
- 학생이 수강한 과목들에 대한 성적을 산출하기 위한 경우 학생 클래스 속성에 과목이 모두 있으면 불합리
- 학생(Student)과 과목(Subject)에 대한 클래스를 분리하여 사용하고 Subject 클래스를 활용하여 수강한 과목들의 변수의 타입으로 선언
- 선언된 Subject 변수는 생성된 인스턴스가 아니므로, Student의 생성자에서 생성하여 사용
Subject.java
public class Subject {
String subjectName;
int score;
int subjectId;
}
Student.java
public class Student {
int studentID;
String studentName;
Subject korea;
Subject math;
Student(int studentID, String studentName) {
this.studentID = studentID;
this.studentName = studentName;
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 showScoreInfo() {
int total = korea.score + math.score;
System.out.println( studentName + " 학생의 총점은 " + total +" 점 입니다.");
}
}
SubjectTest.java
public class SubjectTest {
public static void main(String[] args) {
Student studentLee = new Student(100, "Lee");
studentLee.setKoreaSubject("국어", 100);
studentLee.setMathSubject("수학", 90);
Student studentKim = new Student(200, "Kim");
studentKim.setKoreaSubject("국어", 50);
studentKim.setMathSubject("수학", 30);
studentLee.showScoreInfo(); //Lee 학생의 총점은 190 점 입니다.
studentKim.showScoreInfo(); // Kim 학생의 총점은 80 점 입니다.
}
}
반응형
'Java' 카테고리의 다른 글
Java 객체 지향 핵심 / 상속, 형 변환, 재정의(override), 다형성 (0) | 2022.11.17 |
---|---|
Java 객체지향 입문 / 배열, 객체 배열, 2차원 배열, ArrayList (0) | 2022.11.16 |
Java 객체지향 입문 / static 변수, static 매서드, singleton 패턴 (0) | 2022.11.16 |
Java 객체 지향 입문 / 접근 제어 지시자, 정보은닉, this, 객체간의 협력 (0) | 2022.11.09 |
Java 객체 지향 입문 / 객체지향이란, 클래스 구현, 함수와 메서드 구현 (0) | 2022.11.07 |