본문 바로가기
Java

Java 객체 지향 입문 / 인스턴스 생성과 힙 메모리, 생성자, 오버로딩, 참조 자료형 변수

by 리잼 2022. 11. 8.
반응형

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 점 입니다.
	}

}

 

반응형