JAVA 객체와 클래스
원본 출처 : https://kephilab.tistory.com/44
이글은 공부를 위해 아래 블로그의 글을 그대로 따라 적은 글입니다. 출처 링크 첨부합니다.
객체는 설계도를 바탕으로 만들어진다.
설계도를 보고 자동차를 만들듯,
메모리에서 사용하고 싶은 객체가 있다면 우선 설계도로 해당 객체를 만드는 작업이 필요하다.
즉 자바에서 설계도는 클래스 class 이다.
클래스에는 객체를 생성하기 위한 필드와 메소드가 정의 되어있다.
클래스로부터 만들어진 객체를 해당 클래스의 인스턴스라고 한다.
(자동차 객체는 자동차 클래스의 인스턴스이다.)
클래스로 부터 객체를 만드는 과정을 인스턴스화라고 한다.
하나의 클래스로부터 여러개의 인스턴스(객체)를 만들 수 있다. (여러대의 자동차)
객체 지향 프로그래밍 개발의 세가지 단계
1. 클래스 설계
2. 설계된 클래스를 가지고 사용할 객체 생성
3. 생성된 객체를 이용하기
main()메소드만 작성해서 실행할 목적으로 클래스를 이용했지만
main()메소드가 없는 클래스는 객체 생성 과정을 거쳐 사용해야 한다.
1. 클래스 선언
사용하고자 하는 객체를 구상했다면, 그 객체의 대표이름을 하나 결정하고 이것을 클래스 이름으로 한다.
ex) 자동차 객체의 클래스 : Car
클래스이름을 정했다면, "클래스이름.java"로 소스파일을 생성해야한다.
소스파일 이름 역시 대소문자를 구분하므로 반드시 클래스 이름과 소스파일 이름이 일치해야한다.
소스파일을 열고 아래와 같이 클래스를 선언한다.
public class 클래스이름 {
}
일반적으로 소스파일당 하나의 클래스를 선언하지만, 두개 이상의 클래스 선언도 가능하다.
public class car {
}
class Tire {
}
두개 이상의 클래스가 선언된 소스파일을 컴파일 하면, 바이트 코드 파일(.class)는 클래스를 선언한 개수만큼 생성된다.
위 코드를 컴파일하면 Car.class, Tire.class 파일이 각각 생성된다. (소스파일은 클래스 선언을 담고있는 저장 단위일 뿐)
public과 class
class앞에 public 입력시 파일명과 클래스명 동일해야 오류가 뜨지않고,
파일명과 클래스명 다를 경우 class 만 입력해야한다.
이런 규칙이 있는 이유:
보통 하나의 자바 파일에 여러개의 클래스를 작성하는 경우에 하나의 대표 클래스를 지정하고
파일명과 동일하게 하는 것이 코드의 가독성에 도움이 되기 때문.
+ 가능하면 파일명과 동일하게 하는 것을 권장한다.
+ 파일 하나당 동일한 이름의 클래스 하나를 선언하는 것이 좋다.
2. 객체 생성과 클래스 변수
클래스를 선언한 다음 컴파일을 했다면 객체를 생성할 설계도가 만들어진 것이다.
클래스로부터 객체를 생성하는 방법은 new 연산자를 사용한다.
new 클래스();
new 연산자로 생성된 객체는 메모리 힙 영역에 생성된다.
메모리 내에 객체의 위치를 알 수 있도록 new 연산자는 힙 영역에 객체를 생성 후 객체의 주소를 반환한다.
3. 생성된 객체 이용하기
new연산자가 반환한 주소를 참조 타입인 클래스 변수에 저장해두면 변수를 통해 객체를 사용할 수 있다.아래는 클래스 타입으로 선언된 변수에 new연산자가 반환한 객체의 주소를 저장하는 코드다.
클래스 변수;
변수 = new 클래스 ();
클래스 변수 선언과 객체 생성을 한개의 실행문으로 작성 할 수 있다.
클래스 변수 = new 클래스 ();
new 연산자로 객체를 생성하고 반환된 객체의 주소를 변수에 저장하면,
아래와 같이 변수가 객체를 참조하게 된다.
예제) Student 클래스를 선언하고, StudentExample클래스의 main 메소드에서 Student객체를 생성한다.
student.java (클래스 선언)
public class Student {
}
StudentExample.java (클래스로부터 객체생성)
public class StudentExample {
public static void main(String[] args) {
Student s1 = new Student();
System.out.println("s1 변수가 Student 객체를 참조합니다.");
Student s2 = new Student();
System.out.println("s1 변수가 Student 객체를 참조합니다.");
}
}
StudenExample.class 가 실행되면 아래 그림과 같이 메모리에 클래스 변수와 객체가 생성된다.
Student 클래스는 하나이지만 new연산자를 사용한 만큼 객체가 메모리에 생성 된다.
이런 객체들은 Student 클래스의 인스턴스들이다.
같은 클래스 Student에서 생성되었지만,
s1, s2가 참조하는 Student 객체들은 완전히 독립된 서로 다른 객체이다.
Student 와 StudentExample 클래스의 용도는 서로다르다.
https://devlogofchris.tistory.com/35
new연산자 추가 설명링크
클래스 용도 구분
1.라이브러리 용도 (API)
라이브러리 클래스는 다른 클래스에서 이용할 목적으로 설계된다.
Student클래스가 라이브러리 클래스에 해당된다.
(Student클래스에 main()메소드를 작성해서 라이브러리인 동시에 실행 클래스로 만들수있다)
2.실행용도
실행 클래스는 프로그램 실행 진입점인 main()메소드를 제공하는 역할을 한다.
public class Student {
//라이브러리로서의 코드 (필드, 생성자, 메소드)
//실행을 위한 코드
public static void main(String[] args) {
Student s1 = new Student();
System.out.println("s1 변수가 Student 객체를 참조합니다.");
Student s2 = new Student();
System.out.println("s1 변수가 Student 객체를 참조합니다.");
}
}
프로그램이 단 하나의 클래스로 구성된다면, 라이브러리인 동시에 실행 클래스인 형태로 작성하는 것이 좋은 방법일 수 있지만, 대부분 객체 지향 프로그램은 라이브러리(부품 객체, 완성 객체)와 실행 클래스가 분리되어있다.
(두 클래스를 분리하는 것이 좋다)
'STUDY > JAVA' 카테고리의 다른 글
[JAVA] 22-06-16 JVM 메모리 구조 ☑ (0) | 2022.06.15 |
---|---|
[JAVA] 객체 지향 OOP ! 개념 이해 추가 정리 ☑ (0) | 2022.06.14 |
[JAVA] 22-06-13 자바의 시작과 Scanner ☑ (0) | 2022.06.13 |
[JAVA] 22-06-13 자바 변수와 데이터 타입 ☑ (0) | 2022.06.13 |
[JAVA] 22-06-13 자바란? ☑ (0) | 2022.06.13 |