Java 클래스와 인스턴스
1. main() 함수
나는 처음에 개발을 접했을 때 모든 클래스가 출력 화면을 띄우는 줄 알았다.
하지만 클래스와 멤버변수등에 대해 배우면서 클래스를 사용해서 어떠한 프로그램을 실행하려면
자바 가상머신(JVM)이 메인 함수를 호출해야 한다는 것을 알게 되었다.
앞서 함수에 대해 학습하면서 main함수에 대해서 이야기 한적이 있다.
public static void main(String[] args ) { }
이렇게 생긴게 메인 함수이다.
이 함수는 자바 가상 머신이 프로그램을 실행하기 위해서 호출하는 함수이다.
클래스를 만들고 클래스의 내부에 적지만 해당 클래스의 함수는 아니다.
static이 붙어있는 것을 보면 알 수 있듯이 정적 메서드이고 프로그램이 실행되기 위해서는 이 메서드가 꼭 적혀있어야 한다.
메인 함수를 실행하는 방법에는 두가지가 있다.
① 해당 클래스의 내부에 메인함수 만들기
② Test 클래스를 만들어서 메인함수로 시작하기
첫번째 방법은 아래와 같이 student클래스가 만들어져 있을 때 아래에 메인 함수를 만드는 것이다.
public class Student{
int studentID;
String studentName;
int grade;
String address;
public String getStudentName(){
return studentName;
}
public void setStudentName(String name){
studentName = name;
}
}
위의 클래스에 메인함수를 만들면 아래와 같이 된다.
public class Student{
int studentID;
String studentName;
int grade;
String address;
public String getStudentName(){
return studentName;
}
public void setStudentName(String name){
studentName = name;
}
public static void main(String[] args){ //main() 함수 만들기
Student studentAhn = new Student(); //객체생성
studentAhn.studentName= "안연수" ;
System.out.println(studentAhn.studentName);
System.out.println(studentAhn.getStudentName());
}
}
위처럼 클래스의 내부에 메인 함수를 만들게 되면 이 클래스가 프로그램의 시작 클래스가 된다.
메인 함수 다음에
Student studentAhn = new Student();
이렇게 생긴 코드가 있는데 이는 생성자를 이용해 객체를 생성하는 코드이다. 생성자에 대한 설명은 뒤에!
생성자를 이용해서 객체를 생성하고 나면 해당 클래스의 메서드등을 쓸 수 있다!
studentAhn.studentName= "안연수"
이 코드는 우리가 생성자로 만든 studentAhn이라는 객체의 이름에 안연수라는 값을 대입하는 것이다.
System.out.println(studentAhn.studentName);
System.out.println(studentAhn.getStudentName());
출력문을 이용해서 객체의 이름에 관한 멤버 변수를 들고 온 것과
이름을 가져오는 메서드를 이용하는 것은 출력문이 같다.
② Test 클래스를 만들어서 메인 함수로 시작하기
두 번째 방법은 새로운 클래스를 만들어서 클래스의 시작을 메인 함수로 시작하는 것이다.
개인적으로 이 방법이 훨씬 깔끔하고 정리가 잘돼서 좋았다.
ctrl+n 을 누르면 새로 만들 수 있는데 class를 새로 만들고 public static void main(String [] args)를 체크한다.

체크하고 클래스를 만들면 이렇게 된다.

클래스 다음에 바로 메인 함수를 만들어서 객체 생성하고 프로그램을 실행하면 된다.

2.new 예약어로 클래스 생성하기
만들어둔 클래스를 이용하려면 main() 함수가 있는 곳에 클래스를 생성해야 한다.
클래스 자료형 변수를 선언하고 new 예약어로 생성자를 호출하여 대입하면 새로운 클래스가 생성됩니다.
클래스형 변수 이름 = new 생성자;
Student studentAhn = new Student();
메인 함수에서 클래스를 만들 때는
먼저 어떤 타입의 클래스를 만들 것인지 선언해주고
new 예약어를 이용하여 메모리 공간(힙 영역)을 할당해준다.
이렇게 할당한 공간의 주소를 참조 변수에 담아준다.
담은 주소가 위의 변수 이름이라고 적혀있는 곳이다.
여기서 빨간색 Student()가 생성자이다.
생성자는 만들려고 하는 클래스의 타입과 동일하게 적어준다.
다르게 적는 경우는 뒤의 게시물에 설명.
이렇게 프로그램에서 실제로 사용할 수 있도록 만들어진 클래스를 '인스턴스'라고 부른다.
그리고 그 인스턴스는 우리가 주소 값을 담았던 변수로 주소를 참조했다는 의미로 '참조 변수'라고 부른다.
위의 예시를 설명하면 student클래스를 만들기 위해 studentAhn이라는 인스턴스를 만든 것이다.
클래스는 일종의 설계도이고 실제로 사용하기 위해 설계도를 따라 만든 것을 인스턴스라고 부른다.
예를 들어
Student studentAhn = new Student();
Student studentLee = new Student();
이렇게 적으면 객체를 두 개 생성한다라고 말할 수도 있고 인스턴스를 두개 만들었다고 말할 수 도있다.
이때 말하는 객체는 학생이라는 클래스 타입에 집중한 것이다.
하지만 저렇게 두 명의 학생을 만들면 우리는 저 두 개의 객체를 다르게 정의하고 비슷하지만 다른 기능을 실행하도록한다(예, 이름, 학번 다름..) 이렇게 개별적인 객체로 구분이되는 것을 우리는 인스턴스라고 한다.
따라서 객체를 두개 생성이라고도 말할 수 있고 인스턴스를 두개 생성했다고 말할 수도 있다.
※new 예약어
:생성자를 호출하여 해당 클래스를 쓸 수 있도록 메모리 공간을 할당하고 변수에 할당된 주소를 대입하여 실제 사용할 수 있도록 한다.
3. 인스턴스와 참조 변수
위에서 가볍게 설명한 객체, 클래스, 인스턴스가 처음에 제일 헷갈렸었다.
자세하게 설명해보자
① 객체: 의사나 행위가 미치는 대상
② 클래스 : 객체를 코드로 풀어서 구현한 것
③ 인스턴스 : 클래스가 메모리 공간에 생성된 상태
세상에 있는 모든 물체는 객체라고 할 수 있다.
그리고 그 객체에 대한 정보와 객체가 할 수 있는 일을 기술해 놓은 것이 클래스이다.
예를 들어 사람과 물병이 있을 때, 우리는 사람 객체와 물병 객체가 있다고 생각하고 이것들을 클래스로 만들 수 있다.
사람 클래스와 물병 클래스를 만들 수 있는 것이다.
사람 클래스에는 사람이 가지는 정보. -이름 , 나이, 키 등등 의 정보를 변수로서 적을 수 있고
밥을 먹는다. 달린다. 걷는다. 등의 기능들을 메서드로서 구현할 수 있다.
물병 클래스에는 뚜껑이 열린다 닫힌다 등의 기능을 구현할 수 있다.
이와 같은 클래스를 이용하여 우리는 인스턴스를 만들 수 있다.
main() 함수를 만들고 생성자를 호출하면 인스턴스가 만들어진다. 생성자의 이름은 클래스의 이름과 같다.
클래스(설계도)는 하나지만 이를 이용하여 인스턴스를 여러 개 만들 수 있고 인스턴스 간의 기능을 서로 이용하면 우리의 프로그램이 만들어진다.
사람과 물병 인스턴스를 만들고 사람이 물병을 잡고 물병 뚜껑을 열어서 사람이 물을 마시는 등의 기능이다.
이때 만들어진 인스턴스는 각각 new연산자를 이용하여 다른 메모리를 할당받아 각각 다른 인스턴스가 된다.
이렇게 만든 인스턴스들은 참조 변수에 담기게 되는데 이 참조 변수는 도트 연산자(.)를 이용하여 사용할 수 있다.
참조 변수. 멤버 변수
참조 변수. 메서드
studentAhn.studentName ="안연수";라고 한다면
studentAhn이라는 인스턴스의 이름을 바꾸기 위해 도트 연산자를 이용하여 이름 변수에 접근하고
대입 연산자인 = 를 이용하여 "안연수"라는 값을 넣어준다.