2021-06-17 강의록_클래스

MIN.DI·2021년 6월 17일
0

강의록

목록 보기
6/54

클래스 용도

  • 라이브러리(API용) : 자체적으로 실행X. 다른 클래스에서 이용할 목적으로 만듦
  • 실행 클래스 : main() 메소드를 가지고 있는 클래스. 실행할 목적.

클래스의 구성 멤버

  1. 필드 (정확히는 인스턴스 필드. 클래스 영역에 선언한 변수는 더이상 변수가 아님. '필드'라고 한다)

  2. 생성자 >> new 연산자가 생성한 객체 초기화(필드에 초기값 넣어줌)

    1. static initializer (정적 초기화)
    public class Person {
    
         	// 아래의 두 필드 --> 인스턴스(Instance, 즉 생성된 객체에 있는) 필드
         	String name;
         	int age;
    
         	// 아래의 필드    --> 정적필드 or static field 라고 부른다.
         	static String nationality;	
            
         	// 인스턴스 필드의 초기화
         	public TTT(String name, int age) {
         		this.name = name;
         		this.age = age;
         	} // constructor
            
            
         	// 정적필드를 초기화 역할
         	// static initializer (= 정적 초기자) >>단 한 번만 수행. 
         	static {
         		// 정적필드의 초기화 수행
         	} // static initializer
  3. 메소드

  • 메소드 영역
    JVM머신이 .class 파일을 읽어서(=loading), 아래 타입의 객체로 만들어서 메소드 영역에 집어넣음.
    java.lang.Class

static필드, 메소드는 클래스 객체(clazz)에 소속
그 외의 모든 필드는 heap에 저장.
메모리영역_클릭


인스턴스(new로 생성된 객체) 필드는 객체(=heap)에 소속.
static 필드, 메소드는 클래스에 소속 -->> 클래스 객체(clazz)에 소속!

메소드 영역(=Class Area) >> vm 이 클래스를 사용하고자 할 때, .class 파일을 읽어서 클래스 객체(Class clazz. 클래스에 대한 모든 정보를 담음) 로 만들어서 찍어 넣는 영역. >> Class Area 라고도 한다.
그 안에 static 필드, 메소드 같은 정보들이 포함되어 있다.

컴파일된 .class파일(컴파일 되어 byte code를 가지고 있는) 을 사용하고자 할 때 class loader(끌어올리는 창)가 byte code를 그대로 읽어서(필드 메소드 생성자) 메소드 영역(클래스 영역)에 클래스 타입의 객체로 만들어 넣음.
메소드도 클래스 영역 안에 들어있기 때문에 공유가 가능한 것.

인스턴스는 생성자가 초기화.
static 필드는 정적 초기자(static initializer)가 초기화. >>jvm에 의해 오로지 단 한 번만 수행.
메소드 영역에 꽂아넣기 바로 직전에 클래스 로더가 딱 한 번 정적 초기화를 수행
clazz객체 안에 있는 정적필드를 초기화해주는 것이 정적 초기자.

static initializer 역시 default constructor처럼 컴파일러가 자동으로 생성해줌.

클래스 안에 정의된 필드는 초기화하여 정의하지 말고(하드코딩 x), 선언만 하는 것이 좋다.
필드의 초기화는 생성자나 정적 초기자가 진행하는 것이 바람직함.


클래스 로딩

어떤 메소드를 호출하는 문장을 만났는데, 그 메소드를 가진 클래스 바이트코드가 아직 로딩(=class Area에 끌어옴)된 적이 없다면 라이브러리 폴더에서 클래스를 찾음.
없으면 Classpath 환경변수에 지정된 폴더에서 클래스 찾음
찾으면 그 클래스파일이 올바른지 바이트코드를 검증.
올바른 바이트코드라면 메소드 영역으로 파일을 로딩.
클래스 변수를 만들라는 명령어가 있으면 메소드 영역에 그 변수를 준비
클래스 블록이 있으면 순서대로 블록 실행
이렇게 한 번 클래스의 바이트코드가 로딩되면 JVM 종료될 때 까지 유지


Clazz객체

메소드 영역에 저장된 Clazz 객체를 얻는 방법

  • 왜 clazz를 얻는지? >> 자바 표준 API에는 Java Reflection API 가 있다.
  1. 클래스 타입명으로부터 Clazz객체를 얻을 수 있다.
    Person.class
    Class clazz = Person.class;
    (배열 속성처럼 .class 속성으로 알아낼 수 있다)

  2. 생성된 객체로부터도 Clazz 객체를 얻어낼 수 있다
    Person person = new Person();
    Class clazz = person.getClass();

  3. java.lang.Class 란 클래스에는, Class.forName() 정적메소드로 얻을 수 있다.(Java Reflection API 이용)
    Class clazz = Class.forName(FQCN);
    ex ) Class clazz = Class.forName("org.person.Person")

  4. JVM Class Loader가 .class 파일을 찾지 못하면, ClassNotFoundException 예외가 발생
    JVM은 찾고자 하는 클래스 파일을, classpath 라고 하는 환경변수에서 찾음.
    이 classpath 변수에는, .class 파일이 들어있는 .jar 파일을 path환경변수처럼 설정.
    (이클립스에서 대신 수행해주므로 개발자가 인지하지 못하는 것)

우리가 사용할 수 있는 대부분의 라이브러리는 .jar라는 파일로 압축하여 제공함.
.jar안에는 무수히 많은 클래스가 있음. (스프링도 .jar 임)


jar

  1. jar 파일이란?
    자바 언어로 만든 압축/해체 프로그램 (7zip처럼)

  2. JDK 의 bin 폴더안에 들어있는 명령어

  3. XXXXX.jar 파일이 있다면, 아래와 같이 관리

    (1) XXXX.jar 파일의 내용 보기
    C:\temp> jar tvf XXXX.jar

    (2) XXXX.jar 파일의 해체(압축풀기)
    C:\temp> jar xvf XXXX.jar

    (3) XXXX.jar 파일의 생성(압축생성)
    C:\temp> jar cvf XXXX.jar 파일1 파일2 디렉토리1 디렉토리2


필드

선언된 필드를 사용하는 방법은, 사용 위치에 따라 두 가지.
1. 객체(class) 내부 : 필드이름으로 바로 접근 (가급적 this.필드이름 으로 사용하는것이 바람직함)
2. 객체(class) 외부 : 참조변수.필드이름 으로 접근.
-->> this 는 객체를 가리키는 참조변수이므로 , 결국 내외부에서의 사용법은 같다.


메소드

  • 메소드 시그니처(Signature)
  • 메소드블록 안에서 선언된 변수 = 지역변수 (필드는 지역변수에 포함되지 않음)
    매개변수(Parameter)는 지역변수로 간주함.
public class Person {	
	String name;	//필드
	int age;
	
	
	void walk(int speed) {	//speed : 매개변수(Parameter). 지역변수로 간주
		int temp = 0;	//temp : 지역변수
		
		;;
	} // walk
	
} // end class
  • 리턴(Return)문
    메소드 실행을 강제 종료
    표현식의 값을 호출자에게 반환

정적 멤버, 인스턴스 멤버

클래스의 멤버(즉 필드, 메소드)는 2가지로 나눌 수 있다.

  1. 정적 멤버(필드, 메소드)
    : 같은 클래스 내에서 만들어진 모든 객체가 공유할만한 가치가 있는 멤버는 정적 멤버로 선언.
    정적 멤버는 정적 멤버답게 사용한다.
    (인스턴스명으로 호출해도 되지만, 클래스명.정적멤버 형태로 호출하는것이 바람직함.)

  2. 인스턴스 멤버(필드, 메소드)
    : 객체 내에서만 유효한 멤버. 객체가 생성되어야만 의미가 생기는 멤버.
    객체 없이는 존재할 수 없다.

  • 대원칙
    인스턴스 멤버 = 인스턴스 멤버 + 정적 멤버 모두 사용 가능
    정적 멤버 = 오로지 정적 멤버만 사용 가능.
    static은 인스턴스 생성 이전에 실행되니까!

  • final / static final
    final 은 각 객체 내에서만 고유하고 변하지 않는 값일 뿐, 모든 객체에 대한 상수는 아니다.
    . ex) 주민등록번호
    static final 은 모든 객체 에서 고유한 진리값을 가지는, 진정한 의미의 상수 이다.
    . ex) 원주율(파이값)

profile
내가 보려고 쓰는 블로그

0개의 댓글

관련 채용 정보