일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Java
- MPA
- 초보개발자
- 예외 처리
- 문자 단위 스트림
- 보조 스트림
- 다형성
- 메서드
- 백엔드
- 변수
- throws
- FileInputStream
- 인스턴스
- exception
- 개발자
- 인터페이스
- 자바
- 코린이
- 자료형
- SSR
- 배열
- 상속
- node.js
- 졸리다
- 바이트 단위 스트림
- try-catch
- ArrayList
- 코딩
- 파이팅
- 새벽공부
- Today
- Total
SHUSTORY
05-4 클래스와 인스턴스 본문
클래스 사용과 main( ) 함수
Student 클래스는 멤버 변수와 메서드로 구성되어 있다.
위의 클래스를 직접 사용해서 결과 값을 출력해보자.
프로그램을 시작하는 main( ) 함수
클래스를 사용하여 프로그램을 실행하려면 main( ) 함수에 대해 알아야 한다.
main( ) 함수는 JVM이 프로그램을 시작하기 위해 호출하는 함수로, 클래스 내부에 만들지만 클래스의 메서드는 아니다.
main( ) 함수를 사용하는 방법은 다음 두 가지가 있다.
1. 우리가 만든 클래스 내부에 main( ) 함수를 만든다.
2. 외부에 테스트용 클래스를 만들어 사용한다.
Student 클래스에 main( ) 함수 포함하기
클래스 내부에 main( ) 함수를 만들면 이 클래스가 프로그램의 시작 클래스가 된다.
14행은 새로운 Student 클래스를 생성하는 코드이고, 15행은 클래스의 멤버 변수에 값을 대입하는 코드이다.
이와 관련해서는 이후에 더욱 자세히 다루겠다.
main( ) 함수를 포함한 실행 클래스 따로 만들기
프로젝트를 수행하거나 SW를 개발할 때 모든 클래스에 main( ) 함수가 있는 것은 아니다.
클래스를 생성할 때 public static void main(String[] args) 칸을 체크해서 main( ) 함수를 만들어주자.
만약 체크하지 않았더라도, 직접 작성해주면 되므로 당황하지 말자.
두 클래스가 같은 패키지에 있기 때문에 위와 같이 코드를 작성해도 문제가 되지 않는다.
하지만 만약 다른 패키지에 존재할 경우 import문을 사용해서 함께 사용하기를 원하는 클래스를 불러와야 한다.
* 클래스 이름이 같아도 패키지가 다르면 다른 클래스이다. CH05 프로젝트의 default 패키지와 classpart 패키지의 Student 클래스는 default.Student 클래스와 classpart.Student 클래스로 다른 이름을 가진 다른 클래스이다.
new 예약어로 클래스 생성하기
클래스를 사용하기 위해 먼저 클래스를 생성해야 한다.
자바에서 클래스를 생성할 때는 new 예약어를 사용하고 이어 생성자를 작성한다.
클래스 자료형 변수를 선언하고 new 예약어로 생성자를 호출하여 대입하면 새로운 클래스가 생성된다.
클래스가 생성되면 클래스를 실제 사용 가능하도록 메모리 공간, 힙 메모리를 할당받는다.
이렇게 사용 가능하도록 생성된 클래스를 '인스턴스'라고 한다.
인스턴스를 가리키는 클래스형 변수를 '참조 변수'라고 한다.
Student 클래스 자료형으로 studentAhn 변수를 선언하고 new Student( );로 Student 클래스를 생성하여 studentAhn에 대입한다는 의미이다. 여기서 studentAhn을 참조변수라 하고 이 변수가 생성된 인스턴스를 가리킨다.
인스턴스와 참조 변수
클래스가 메모리 공간에 생성된 상태를 인스턴스라고 한다.
또한 생성된 클래스의 인스턴스를 객체라고도 한다.
하나의 클래스로부터 인스턴스를 여러 개 생성할 수도 있다.
인스턴스 여러 개 생성하기
생성자를 두 번 사용하여 student1, student2라는 이름의 서로 다른 인스턴스 두 개를 생성하였다.
이렇게 사용된 인스턴스는 다음과 같이 참조하여 사용할 수 있다. (위 예제의 8,9 / 12,13 행 참고)
인스턴스와 힙 메모리
new Student( )를 선언하면 Student 하나가 생성되는데 각 Student는 StudentID, StudentName 등의 멤버 변수를 지닌다.
각 멤버 변수를 저장할 공간이 있어야 하는데, 이 때 사용하는 메모리가 힙 메모리이다.
클래스 생성자를 하나 호출하면 인스턴스가 힙 메모리에 생성된다.
생성된 Student 클래스를 student1 변수에 대입하면 인스턴스가 저장된 메모리를 student1 변수가 가리킨다.
* 지역 변수는 스택 메모리에 생성된다.
* 인스턴스는 힙 메모리에 생성된다.
지역 변수에 생성된 인스턴스를 대입하는 것은 student1에 인스턴스가 생성된 힙 메모리의 주소를 대입한다는 것과 같은 의미이다.
* 힙 메모리란 프로그램에서 사용하는 동적 메모리 공간을 말한다. 일반적으로 프로그램은 스택, 힙, 데이터 세 영역을 사용하는데, 객체가 생성될 때 사용하는 공간이 힙이다. 힙은 동적으로 할당되며 사용이 끝나면 메모리를 해제해 주어야 하는데, 자바에서는 이 역할을 가비지 컬렉터가 수행한다.
클래스가 생성될 때마다 인스턴스는 다른 메모리 공간을 차지한다.
멤버 변수를 저장하는 공간이 매번 따로 생긴다는 의미이다.
이러한 이유로 클래스에 선언한 멤버 변수를 '인스턴스 변수' 라고 부르기도 한다.
참조 변수와 참조 값
참조 변수는 힙 메모리에 생성된 인스턴스를 가리킨다.
( = 힙 메모리에 생성된 인스턴스의 메모리 주소는 참조 변수에 저장된다. )
출력 내용은 위와 같이 '클래스명@주소 값'이다.
주소 값은 해시코드 값이라고도 하는데, 이는 JVM에서 객체가 생성되었을 때 생성된 객체에 할당하는 가상 주소 값이다.
따라서 student1 변수를 사용하여 student1 인스턴스를 참조할 수 있다.
이 때 student1을 참조 변수, 주소 값을 참조 값이라고 한다.
용어 | 설명 |
객체 | 객체 지향 프로그램의 대상, 생성된 인스턴스 |
클래스 | 객체를 프로그래밍하기 위해 코드로 만든 상태 |
인스턴스 | 클래스가 메모리에 생성된 상태 |
멤버 변수 | 클래스의 속성, 특성 |
메서드 | 멤버 변수를 이용하여 클래스의 기능을 구현 |
참조 변수 | 메모리에 생성된 인스턴스를 가리키는 변수 |
참조 값 | 생성된 인스턴스의 메모리 주소 값 |
교재 예제 풀어보기 완료
'프로그래밍 > JAVA' 카테고리의 다른 글
05-6 참조 자료형 (0) | 2023.02.20 |
---|---|
05-5 생성자 (1) | 2023.02.20 |
05-3 메서드 (0) | 2023.02.20 |
05-2 클래스 살펴보기 (0) | 2023.02.20 |
05-1 객체 지향 프로그래밍과 클래스 (0) | 2023.02.20 |