[그린컴퓨터] Server/JAVA(객체 지향 프로그래밍)

클래스와 인스턴스 {main 함수, main 함수를 사용하는 두 가지 방법, new 예약어로 클래스 생성하기, 인스턴스와 참조변수, 인스턴스와 힙 메모리, 객체 지향 프로그램 관점 용어 정리}

Ben의 프로그램 2023. 5. 17. 11:21
728x90

클래스 사용과 main( ) 함수

  • 우리가 만든 클래스를 다시 한 번 살펴보겠습니다.
class Student {
	int studentID;
	String studentName;
	int grade;
	String address;
	
	public String getStudentName(String name) {
		return studentName;
	}
	
	public void setStudentName(String name) {
		studentName = name;
	}
}
  • Student 클래스(Student 객체)는 속성과 기능으로 구성되어 있습니다.
  • 멤버 변수는 클래스 속성을 나타내고, 메서드는 멤버 변수를 이용하여 클래스 기능을 구현합니다.
  • 이렇게 만든 클래스를 직접 사용해서 결과 값을 출력해 봅시다.

프로그램을 시작하는 main( ) 함수

  • 클래스를 사용하여 프로그램을 실행하려면 먼저 main( ) 함수를 알아야 합니다. 
  • main( ) 함수는 자바 가상 머신(JVM)이 프로그램을 시작하기 위해 호출하는 함수입니다.
  • 클래스 내부에 만들지만, 클래스의 메서드는 아닙니다.

main( ) 함수를 사용하는 두 가지 방법

Student 자바 파일 안에 main( ) 함수 포함하기

public class Student {
	int studentID;
	String studentName;
	int grade;
	String address;
	
	public String getStudentName(String studentname) {
		return studentName;
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Student studentAhn = new Student();
		studentAhn.studentName = "안연수";
		
		System.out.println(studentAhn.studentName);
	}

}
  • < Student studentAhn = new Student(); > 부분은 새로운 Student 클래스의 인스턴스를 생성하는 코드입니다.
  • < studentAhn.studentName = "안연수"; > 부분은 생성한 Student 클래스의 인스턴스의 멤버 변수인 studentName 에 "안연수"라는 값을 초기화시켜주는 코드입니다.
  • 클래스를 생성하는 new 예약어는 곧 배울 겁니다. 
  • 그런데 이런 식으로 클래스 테스트를 수행하면 거의 모든 클래스가 main( ) 함수를 포함해야 합니다. 하지만, 프로젝트를 수행하거나 소프트웨어를 개발할 때 모든 클래스에 main( ) 함수가 있는 것은 아닙니다. 

Stdent 자바 파일 밖에서 main( ) 함수를 포함한 실행 클래스 따로 만들기

  • Student 클래스를 실행하기 위해 같은 패키지에 StudentTest.java 파일을 만들어 봅시다.
public class StudentText {

	public static void main(String[] args) {
		Student studentAhn = new Student();
		studentAhn.studentName = "안연수";
		
		System.out.println(studentAhn.studentName);
	}

}
  • StudentTest 클래스 내부에서 Student 클래스의 인스턴스를 만들어서 실행시킬 수 있습니다. 이렇게 하면 Student 클래스 내부에 main 함수를 만들지 않고 Student 클래스를 테스트해 볼 수 있습니다.
  • 현재 두 클래스가 같은 패키지에 있기 때문에 패키지 이름이 같습니다. 
  • 이런 경우는 위와 같이 바로 다른 자바 파일에 있는 클래스를 사용할 수 있습니다.
  • 그런데 만약 패키지가 다르다면 import 문을 사용해서 함께 사용하기를 원하는 클래스를 불러와야 합니다.

클래스 이름이 같아도 패키지가 다르면 다른 클래스입니다. (클래스 전체 이름)

  • Student 라는 같은 이름의 두 클래스를 하나의 패키지에 구현하면 같은 이름의 클래스가 존재하기 때문에 오류가 발생합니다.
  • 왜냐하면 aaa 패키지의 하위 Student 클래스의 진짜 이름은 aaa.Student 이기 때문입니다. 그래서 다른 자바 파일이라 할지라도 Student 클래스를 만들면 해당 클래스의 진짜 이름도 aaa.Student 가 되기 때문에 같은 이름을 가진 자바 클래스가 2개가 됩니다.
  • 이를 클래스 전체 이름 (class full name) 이라고 합니다.
  • 따라서 패키지가 다르면 클래스 이름이 같아도 클래스 전체 이름은 다르기 때문에 다른 클래스가 됩니다. 

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

  • 우선 클래스를 생성하는 코드의 형태는 아래와 같습니다.
클래스형 변수이름 = new 생성자;

  • 자바에서 클래스를 생성할 때는 new 예약어를 사용하고 이어서 생성자를 써 줍니다.
  • 클래스형(클래스 자료형) 변수를 선언하고 new 예약어로 생성자를 호출한 것을 대입하면 새로운 클래스가 생성니다. 
  • 클래스가 생성된다는 것은 클래스를 실제 사용할 수 있도록 메모리 공간(힙 메모리)을 할당 받는다는 뜻입니다. 
  • 이렇게 실제로 사용할 수 있도록 생성된 클래스를 '인스턴스'라고 합니다. 
  • 그리고 인스턴스를 가리키는 클래스형 변수를 '참조 변수'라고 합니다.
Student studentAhn = new Student( );
클래스형+변수이름 = 예약어+생성자
  • 위 코드는 Student 클래스 자료형으로 studentAhn 변수를 선언하고 new Student( ); 로 Student 클래스를 생성하여 studentAhn 에 대입한다는 뜻입니다. 
  • 이때 studentAhn 을 참조변수 라고 하고, 이 변수가 생성된 인스턴스를 가리킵니다.

인스턴스와 참조 변수

객체, 클래스, 인스턴스

  • 객체란 '의사나 행위가 미치는 대상'입니다.
  • 객체를 코드로 구현한 것이 클래스입니다.
  • 클래스가 메모리 공간에 생성된 상태가 인스턴스입니다.
'의지나 행위'가 미치는 대상 [객체]   객체를 구현한 [클래스]  메모리 공간에서 생성된 인스턴스
             학생                 >>   Student 클래스    >>      Student1 인스턴스
  • 인스턴스는 여러 개 생성할 수도 있습니다.
  • 클래스는 하나지만, 이 클래스로부터 여러 개의 인스턴스를 생성할 수 있습니다. 
  • 예를 들어 학교에서 학생이란 추상어는 뜻이 하나이지만, 그 학교에 다니는 학생 개개인은 여러 명인 것과 같습니다.
  • 각 학생은 이름이 다르고, 학번이 다르고, 학년이 다릅니다. 
  • 즉 클래스라는 틀에서 인스턴스를 여러 개 만들어 프로그램을 구현하는 것입니다. 

인스턴스 여러 개 생성하기

  • 인스턴스는 하나 이상 만들 수 있습니다.
public class StudentTest1 {

	public static void main(String[] args) {
	//클래스형 + 변수명 = new예약어 + 생성자
		Student student1 = new Student();
		student1.studentName = "안연수";
		System.out.println(student1.getStudentName());
		Student student2 = new Student();
		student2.studentName = "안승연";
		System.out.println(student2.getStudentName());
	}

}
  • 서로 다른 변수에 생성자를 각각 사용하여 클래스를 두 개 생성하였습니다.
  • 즉, Student 클래스의 서로 다른 인스턴스 2개를 생성했습니다. 
  • 이렇게 만든 인스턴스를 어떻게 사용하는지 알아보겠습니다.

참조 변수 사용하기

  • 참조 변수를 사용하면 인스턴스의 멤버 변수와 메서드를 참조하여 사용할 수 있습니다.
  • 참조 변수를 사용할 때 도트(.) 연산자를 사용합니다.
    student1.studentName = "안연수";
    System.out.println(student1.getStudentName());
  • 위에서는 student1 라는 참조 변수를 사용하여 Student 클래스의 인스턴스가 가지고 있는 멤버 변수와 메서드를 사용하였습니다.

인스턴스와 힙 메모리

인스턴스가 생성되는 과정 자세히 살펴보면서 스택 메모리와 힙 메모리의 관계 보기

  • new Student( ) 를 선언하면 Student 가 하나 생성됩니다.
  • Student 는 studentID, studentName 등의 멤버 변수를 가지고 있습니다.
  • 그런데 이들 변수를 저장할 공간이 있어야 합니다. 
  • 이때 사용하는 메모리가 힙 메모리(heap memory)니다.
  • 클래스 생성자를 하나 호출하면 인스턴스가 힙 메모리에 생성되는 것입니다.
Student studentAhn = new Student();
  • 위와 같이 생성된 클래스를 studentAhn 변수에 대입하면, 인스턴스가 저장된 메모리를 studentAhn 변수가 가리킵니다. 다음과 같이 그림으로 표현할 수 있습니다.
[스택 메모리]     >>       [힙 메모리]
  stdentAhn      >>    Student 클래스 생성

요 그림도 같이 참조해서 보시면 도움이 됩니다.

  • studentAhn 변수는 지역 변수입니다. 
  • 지역 변수는 스택 메모리에 생성됩니다. 
  • 인스턴스는 힙 메모리에 생성됩니다.
  • 지역 변수 studentAhn 에 생성된 인스턴스를 대입하는 것은 studentAhn(지역변수, 참조변수) 에 인스턴스가 생성된 힙 메모리의 주소를 대입한다는 것과 같은 의미입니다.
  • 그럼 다음과 같이 두 개의 인스턴스를 생성한 경우를 생각해 보겠습니다.
Student student1 = new Student();
Student student2 = new Student();
  • 생성된 두 인스턴스는 당연히 각각 다른 메모리 공간(힙 메모리)을 차지니다. 
  • 따라서 student1.studentName 과 student2.studentName 은 서로 다른 힙 메모리에 서로 다른 값을 가집니다.
        [스택 메모리]                      [힙 메모리]
student1(참조변수, 지역변수)      >>     Student 클래스 생성
student2(참조변수, 지역변수)      >>     Student 클래스 생성
  • 클래스가 생성될 때마다 인스턴스는 다른 메모리 공간(힙 메모리)을 차지합니다.
  • 다른 말로 하면, 멤버 변수 & 멤버 메서드를 저장하는 공간이 매번 따로 생긴다는 의미입니다.
  • 이런 이유로 클래스에 선언한 멤버 변수를 '인스턴스 변수'라고도 부릅니다.

힙 메모리란? (heap memory)

  • 힙 (heap)은 프로그램에서 사용하는 동적 메모리(dynamic memory) 공간을 말합니다. 
  • 일반적으로 프로그램은 스택, 힙, 데이터 이렇게 3 영역을 사용합니다.
  • 객체가 생성될 때 사용하는 공간이 힙(heap)입니다.
  • 힙(동적 메모리)은 동적으로 할당되며 사용이 끝나면 메모리를 해제해 주어야 합니다.
  • C나 C++ 언어에서는 프로그래머가 직접 메모리를 해제해야 하지만, 자바에서는 가비지 컬렉터(garbage collector)가 자동으로 메모리를 해제해 줍니다.

참조 변수와 참조 값(해시코드 값)

  • 참조 변수힙 메모리에 생성된 인스턴스가 위치하고 있는 주소 값을 가지고 있습니다. 
  • 실제로 참조 변수에 어떤 값이 들어 있는지 출력해 보겠습니다.
package exercise;

public class StudentTest2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Student student1 = new Student();
		Student student2 = new Student();
		System.out.println(student1);
		System.out.println(student2);
	}

}

  • 힙 메모리에 생성된 인스턴스의 메모리 주소참조 변수에 저장니다.
  • 출력 된 내용을 살펴보면 인스턴스가 위치하고 있는 힙 메모리 주솟 값은 다음과 같은 형태입니다.
클래스이름@주소값
(인스턴스의 힙 메모리 주소 값)
  • 참조 변수가 가지고 있는 힙 메모리에 생성된 인스턴스의 메모리 주소 값해시 코드(hash code) 값이라고 합니다. 
  • 해시 코드(hash code) 값자바 가상 머신(JVM)에서 객체가 생성되었을 때 생성된 객체에 할당하는 가상 주소 값입니다.
  • student1 변수를 사용하여 student1 인스턴스를 참조할 수 있습니다.
  • 이때, student1참조 변수, student1 인스턴스의 해시 코드 값(주소 값)참조 값 이라고 합니다.

객체 지향 프로그램 관점 용어 정리

  • 객체 : 객체 지향 프로그램의 대상, 생성된 인스턴스
  • 클래스 : 객체를 프로그래밍하기 위해 코드로 만든 상태
  • 인스턴스 : 클래스가 메모리에 생성된 상태
  • 멤버 변수 : 클래스의 속성, 특성
  • 메서드 : 멤버 변수를 이용하여 클래스의 기능을 구현
  • 참조 변수 : 메모리에 생성된 인스턴스를 가리키는 변수
  • 참조 값 : 생성된 인스턴스의 메모리 주소 값