꾸준하게 기록하기
article thumbnail
자바의 정석을 공부하면서 공부내용을 정리했습니다.

 

변수 하나의 데이터를 저장할 수 있는 공간
배열 같은 종류의 여러 데이터를 하나의 집합으로 저장할 수 있는 공간
구조체 서로 관련된 여러 데이터를 종류에 관계없이 하나의 집합으로 저장할 수 있는 공간
클래스 데이터와 함수의 결합(구조체 + 함수)

 

🌱 변수

변수는 클래스변수, 인스턴스변수, 지역변수 세 종류가 있다.

변수의 종류를 결정짓는 중요한 요소는 '변수의 선언되 위치'이다.

 

멤버변수를 제외한 나머지 변수들은 모두 지역변수 

멤버변수 중 static 이 붙은 것은 클래스 변수, 붙지 않은 것은 인스턴스변수이다.

class Variables
{
	int iv; // 인스턴스 변수
    static omt cv; // 클래스변수(static 변수, 공유변수)
    
    void method()
    { // 메서드 영역
    	int lv = 0; // 지역변수 
    }
    
}

 

🌱 메서드 

특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것이다.

 

메서드를 사용하는 이유 

1. 높은 재사용성(resuability)

2. 중복된 코드의 제거 

 

🌱 JVM의 메모리 구조

1. 메서드 영역 : 프로그램 실행 중 어떤 크래스가 사용되면, JVM은 해당 클래스의 클래스파일을 읽어서 분석하여 클래스에 대한 정보를 메서드 영역에 저장한다. 이 때, 그 클래스의 클래스변수도 함께 생성된다.

2. 힙 : 인스턴스가 생성되는 공간. 프로그램 실행 중 생성되는 인스턴스는 모두 힙 영역에 생성된다.

3. 호출스택 : 메서드의 작업에 필요한 메모리 공간 제공. 메서드 호출 시, 호출된 메서드를 위한 메모리가 할당되며 이 메모리는 메서드가 작업을 수행하는 동안 지역변수들과 연산의 중간결과 등을 저장하는데 사용한다.

메서드가 작업을 마치면 할당되었던 메모리 공간은 반환되어 비워진다.

 

🌱 기본형 매개변수와 참조형 매개변수

기본형 매개변수 : 변수의 값을 읽기만 할 수 있다.

참조형 매개변수 : 변수의 값을 읽고 변경할 수 있다.

 

🌱 참조형 반환타입

반환타입이 참조형이라는 것은 메서드가 객체의 주소를 반환한다는 것을 의미한다. 

 

🌱 재귀호출

메서드 내부에서 메서드 자신을 다시 호출하는 것

void method() {
	method();	// 재귀호출. 메서드 자신을 호출한다
}

호출된 메서드는 값에 의한 호출을 통해, 원래의 값이 아닌 복사된 값으로 작업하기 떄문에 호출된 메서드와 관계없이 독립적인 작업수행이 가능하다.

 

🌱 클래스 메서드(static 메서드)와 인스턴스 메서드

인스턴스메서드는 메서드의 작업을 수행하는데 인스턴스 변수를 필요로 하는 메서드

클래스의 멤버변수 중 모든 인스턴스에 공통된 값을 유지해야하는 것이 있는 경우 static을 붙여준다.

 

class TestClass2 {
	int iv;							// 인스턴스 변수	
    static int cv;					// 클래스 변수
    
    void instanceMethod() {			// 인스턴스 메서드
    	System.out.println(iv);		// 인스턴스 변수를 사용할 수 있다.
        System.out.println(cv);		// 클래스 변수를 사용할 수 있다.
    }
	
    static void staticMethod() {	// static 메서드
    	System.out.println(iv);		// 에러! - 인스턴스 변수를 사용할 수 없다.
        System.out.println(cv);		// 클래스 변수를 사용할 수 있다.
    }
}

같은 클래스 내의 메서드는 서로 객체의 생성이나 참조변수 없이 직접 호출이 가능하지만 static메서드는 인스턴스 매서드를 호출할 수 없다.

 

🌱 오버로딩(overloading)

한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 메서드 오버로딩 또는 간단히 오버로딩이라 한다.

 

오버로딩 조건 1. 매서드 이름이 같아야 한다. 

오버로딩 조건 2. 매개변수의 개수 또는 타입이 달라야 한다.

 

반환 타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다.

 

메서드 매개변수 개수가 고정적이었으나 JDK1.5부터 동적으로 지정해 줄 수 있게 됬으며, 가변인자라고 한다.

타입... 변수명과 같은 형식으로 선언한다.

 

🌱 생성자(Constructor)

인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'이다.

메서드 처럼 클래스 내에 선언되며, 구조도 매세드와 유사하지만 리턴값이 없다는 점이 다르다.

 

생성자 조건 

1. 생성자의 이름은 클래스의 이름과 같아야 한다.

2. 생성자는 리턴값이 없다. (리턴 값이 없음을 뜻하는 void는 생략가능)

클래스이름(타입 변수명, 타입 변수명, ...) {
	// 인스턴스 생성 시 수행될 코드
    // 주로 인스턴스 변수의 초기화 코드를 적는다.
}

class card {
	Card() { // 매개변수가 없는 생성자
    }
    
    Card(String k, int num) { // 매개변수가 있는 생성자
    }
}

연산자 new가 인스턴스를 생성하는 것이지 생성자가 인스턴스를 생성하는 것이 아니다.

 

매개 변수가 있는 생성자

Car c1 = new Car();
c1.color = "white";
c1.gearType = "auto";
c1.door = 4;

 

위에 코드처럼 인스턴스를 생성한 다음에 인스턴스 변수의 값을 변경하는 것보다 

아래 처럼 매개변수가 있는 생성자를 사용한다면 인스턴스를 생성하는 동시에 원하는 값으로 초기화 할 수 있다.

 

Car c = new Car("white", "auto", 4);

 

생성자에서 다른 생성자 호출하기 - this(), this

조건1. 생성자의 이름으로 클래스이름 대신 this 사용

조건2. 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능

 

생성자 간의 호출은 this 사용

class Car2 {
	String color;		// 색상
	String gearType;	// 변속기 종류 - auto(자동), manual(수동)
	int door;			// 문의 개수
	
	Car2(){
		this("white", "auto", 4);	// Car(String color, String gearType, int door)를 호출
	}
	Car2(String color){
		this(color, "auto", 4);
	}
	Car2(String color, String gearType, int door){
    	// 매개변수로 선언된 변수 이름과 인스턴스 변수 이름이 같을 경우
        // 인스턴스 변수 앞에 this 를 사용하면 된다.
		this.color = color;
		this.gearType = gearType;
		this.door = door;
	}
}

this는 참조 변수

this(), this(매개변수) 는 생성자. 같은 클래스의 다른 생성자를 호출할 때 사용

 

생성자를 이용한 인스턴스의 복사

class Car3 {
	String color;		
	String gearType;	
	int door;			
	
	Car3(){
		this("white", "auto", 4);	
	}
	Car3(Car3 c){	// 인스턴스 복사를 위한 생성자
		color = c.color;
		gearType = c.gearType;
		door = c.door;
	}
	Car3(String color, String gearType, int door){
		this.color = color;
		this.gearType = gearType;
		this.door = door;
	}
}

public class CarTest3 {

	public static void main(String[] args) {
		Car3 c1 = new Car3();
		Car3 c2 = new Car3(c1);	// c1의 복사본 c2 생성
		
		System.out.println("c1의 color = "+ c1.color + 
				", gearType = "+ c1.gearType +
				", door = "+ c1.door );
		
		System.out.println("c2의 color = "+ c2.color + 
				", gearType = "+ c2.gearType +
				", door = "+ c2.door );
		
		c1.door = 100;	// c1의 인스턴스 변수 door 의 값 변경
		System.out.println("c1.door = 100; 수행 후");
		System.out.println("c1의 color = "+ c1.color + 
				", gearType = "+ c1.gearType +
				", door = "+ c1.door );
		
		System.out.println("c2의 color = "+ c2.color + 
				", gearType = "+ c2.gearType +
				", door = "+ c2.door );
		
	}
}

인스턴스 c2는 c1을 복사하여 생성되어서 서로 같은 상태이지만, 서로 독립적인 메모리 공간에 존재하므로 c1의 값이 변경되어도 c2에 영향을 주지 않는다.

 

🌱 변수의 초기화

변수를 선언하고 처음으로 값을 저장하는 것

멤버변수(클래스/인스턴스 변수)와 배열의 초기화는 선택적, 지역변수의 초기화는 필수적

class InitTest {
	int x;		// 인스턴스 변수
    int y = x;	// 인스턴스 변수
    
    void method() {
    	int i;		// 지역변수
        int j = i;	// 에러! 지역변수를 초기화하지 않고 사용
    }
}

 

1. 명시적 초기화

변수를 선언과 동시에 선언하는 것을 명시적 초기화라고 한다.

class Car {
  int door = 4;				// 기본형 변수 초기화
  Engine e = new Engine(); // 참조형 변수 초기화 
}

2. 초기화 블럭

class InitBlock {
	statc { //클래스 초기화 블럭 }
    
    { // 인스턴스 초기화 블럭}
}

클래스 초기화 블럭 : 클래스가 메모리가 처음 로딩될 때 한번 수행

인스턴스 초기화 블럭 : 생성자와 같이 인스턴스를 생성할 때 마다 수행

 

 

🌱 해당 코드 깃 주소

 

 

728x90

'Language > JAVA' 카테고리의 다른 글

[JAVA] Chapter 8. 예외처리  (0) 2022.05.27
[JAVA] Chapter 7. 객체 지향 프로그래밍Ⅱ  (0) 2022.05.24
[Java] HTML 특수 문자 decode  (0) 2021.08.12
[JAVA] Map - getOrDefault 란?  (0) 2021.06.28
[JAVA] Chapter5. 배열  (0) 2021.05.20
profile

꾸준하게 기록하기

@:_:

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!