Notice
Recent Posts
Recent Comments
«   2024/10   »
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
10-11 00:15
Archives
Today
Total
관리 메뉴

Developer_Neo

[코드스테이츠 백엔드 2기(40기) SEB BE] 11일차 본문

코드스테이츠

[코드스테이츠 백엔드 2기(40기) SEB BE] 11일차

_Neo_ 2022. 7. 7. 11:29
반응형

오늘 나의 학습 목표는 무엇인가요?

-  클래스와 객체를 배우고, 필드와 메서드를 배운다.

 

오늘 학습할 내용 중에 이미 알고 있는 내용은 무엇인가요?

     필드라는 용어 빼고, 알고있는 상태


클래스

- 우리가 인지할 수 있는 실재하는 모든 것이자 사용할 수 있는 실체인 객체를 정의한 설계도, 틀이라고 할 수 있다.

- 클래스는 자동차를 만드는 공장, 객체는 자동차라고 생각을 해도 됩니다.

- 클래스는 크게 Data(속성)와 메소드로 이루어진다.

- 클래스는 직접적으로 활용해 코드로 사용할 수 없습니다. 꼭 클래스를 이용해 객체를 생성해야지만 사용할 수 있습니다. (하지만 Static으로 선언되어 있는 메서드의 경우 사용 가능.)

class 클래스명 { // 클래스 정의
	-- 생략 --
}

더 나아가서 자세히 보면 클래스는 필드, 메서드, 생성자, 이너클래스라는 구성요소로 이루어집니다.

public class Example {
	int q = 10; // (1)필드
	void printq() {...} // (2)메서드
	Example {...} // (3)생성자
	class Example2 {...} // (4)이너 클래스
}

필드 - 클래스의 속성을 나타내는 변수입니다. 

메서드 - 클래스의 기능을 나타내는 함수입니다. 

생성자 - 클래스의 객체를 생성하는 역할을 합니다.

이너 클래스 - 클래스 내부의 클래스를 의미합니다.

 


객체

- 클래스를 통해 생성되며, 생성된 객체를 해당 클래스의 인스턴스라고 부릅니다.

- 클래스로부터 객체를 만드는 과정을 인스턴스화라고 합니다.

 

객체 vs 인스턴스

객체는 모든 인스턴스를 포괄하는 넓은 의미를 가지고 있는 반면, 인스턴스는 해당 객체가 어떤 클래스로부터 생성된 것인지를 강조한다는 데 그 차이가 있다고 할 수 있습니다.

 

 

객체의 생성

클래스명 참조_변수명; // 인스턴스를 참조하기 위한 참조변수 선언
참조_변수명 = new 생성자(); // 인스턴스 생성 후, 객체의 주소를 참조 변수에 저장

클래스명 참조_변수명 = new 생성자();

참조 변수는 실제 데이터 값이 아니라 실제 데이터가 저장되어 있는 힙 메모리의 주소값을 가리킵니다

 

 

메모리공간

code (실행할 프로그램의 코드)
data  (전역변수, 정적변수)
heap (동적할당)
스택  (지역변수, 매개변수)

클래스 정보인 필드(data)와 메서드인 클래스 맴버들은 static영역인 data영역에 올라갑니다.

 

생성자로 만들어진 즉, new로 만들어진 인스턴스는 힙 영역에 들어갑니다. 이러면 클래스 내에 있는 필드들이 이 영역에 올라가있고 메서드는 여기에 올라가지 않습니다. 

왜냐하면 메서드는 공통의 것이기 때문에 Heap영역에 메모리를 중복해서 가지고 있을 필요가 없기 때문이고, 메서드에 대한 부분은 static영역인 data영역에 올라가 있게 됩니다.

따라서 힙영역에는 클래스의 경우 인스턴스 변수만 올라간다고 생각하면 됩니다.

 

스택 영역에는 new인 동적할당을 한 부분이 아닌 함수들이 이 부분에 할당이 됩니다.

자바에서 public static void main을 예로 보면, 이 안에 선언되어 있는 new로 선언된 것이 아닌 변수들이나 static으로 설정한 것들이 이 영역에 들어갑니다.

 

 

객체의 활용

참조 변수명.필드명 // 필드값 불러오기
참조 변수명.메서드명() // 메서드 호출

필드명을 적을 때 만약, 필드명을 public으로 설정해놓았다면 값을 넣는 것이 가능하다.

 


변수는 크게 클래스 변수(class variable), 인스턴스 변수(instance variable), 그리고 지역 변수(local variable)라는 세 가지로 구분될 수 있습니다.

 

필드

- 클래스에 포함된 변수를 의미한다.

- 필드라 부른 것은 클래스 변수와 인스턴스 변수이며, 이 둘은 다시 static 키워드의 유무로 구분된다.

- static 키워드가 함께 선언된 것은 클래스 변수, 그렇지 않은 것은 인스턴스 변수입니다.

왜냐하면 static키워드로 선언된 것은 메서드와 똑같이 변하지 않는 읽기용이라서 메모리의 data영역에 클래스 정보가 저장될 때 여기에 static키워드로 선언된 변수가 저장된다. 그리고 static으로 설정되지 않은 것은 인스턴스마다 다른 값을 가질 수 있기에 Heap영역에 인스턴스 변수로써 저장이 된다.

 

class Example { // => 클래스 영역
	int instanceVariable; // 인스턴스 변수   ->heap영역
	static int classVariable; // 클래스 변수(static 변수, 공유변수)  -> data영역

	void method() { // => 메서드 영역   -> data영역
		int localVariable = 0; // 지역 변수. {}블록 안에서만 유효
	}
}

method에 해당하는 코드가 data영역에 있는 것이고 main문에서 Example 클래스에 대한 객체를 생성해 method()인 메서드를 호출하게 되면 main의 Stack영역에 method()가 올라가게되고, 지역변수인 localVariable이 stack에 위치하여 메모리를 차지하고 있게 됩니다.

(지역변수는 메서드 내에 선언되며 메서드 내({} 블록)에서만 사용가능한 변수입니다. 멤버 변수와는 다르게 지역변수는 스택 메모리에 저장되어 메서드가 종료되는 것과 동시에 함께 소멸되어 더이상 사용할 수 없게 됩니다.)

 

만약, main문에서 문자열로써 "abc"를 저장하는 변수가 있다면 문자열 "abc"는 heap영역에 저장되어있습니다. 이때 추가적으로 만든 class내의 메소드안에 String val="abc";를 해놓았다면, 메소드 호출시 지역변수로써 val는 Heap영역의 주소값을 가지고 있게 된다.

 

- 클래스 변수는 독립적인 저장 공간을 가지는 인스턴스 변수와 다르게 공통된 저장공간을 공유합니다.

- 한 클래스로부터 생성되는 모든 인스턴스 들이 특정한 값을 공유해야하는 경우에 주로 static 키워드를 사용해 클래스 변수를 선언한다.

- 클래스 변수는 인스턴스 변수와 달리 인스턴스를 따로 생성하지 않고도 언제라도 클래스명.클래스변수명 을 통해 사용이 가능합니다.

 

- 힙 메모리에 저장되는 필드 변수는 객체가 없어지지 않는 한 절대로 삭제되는 않는 반면, 스택 메모리에 저장되는 지역변수는 한동안 사용되지 않는 경우 가상 머신에 의해 자동으로 삭제된다.

- 필드 변수와 지역 변수의 주요한 한 가지 차이점은 초기값인데 직접 초기화하지 않으면 값을 출력할 때에 오류가 발생하는 지역변수와는 다르게 필드 변수는 직접적으로 초기화를 실행하지 않더라도 강제로 초기화가 이루어진다.

- 힙 메모리에는 빈 공간이 저장될 수 없기 때문에 이곳에 저장되는 필드는 강제로 초기화되지만, 스택 메모리는 강제로 초기화되지 않으므로 지역 변수는 선언시 반드시 초기화를 실행해야한다.

 

클래스 내에 static변수가 있다면 이것은 객체를 생성하지 않고 클래스명.변수명 의 형식으로 호출이 가능하다.


메서드

- 특정 작업을 수행하는 일련의 명령문들의 집합

- 클래스의 기능에 해당하는 내용들을 담당

 

자바제어자 반환타입 메서드명(매개 변수) { // 메서드 시그니처
	메서드 내용 // 메서드 바디
}

public static int add(int x, int y) { 
	return x + y;
}

- 포인트 연산자(.)를 통해 메서드를 호출할 수 있다.

 

메서드 오버로딩(Method Overloading)

- 하나의 클래스 안에 같은 이름의 메서드를 여러 개 정의하는 것 (매개변수의 수나 매개변수의 타입을 다르게 해서)

- 반환타입과 메서드명은 동일해야한다.

 


오늘 학습 내용 중 새롭게 배운 내용은 무엇인가요?

       -  클래스의 정보가 따로 data영역에 저장되는 사실.

 

오늘 새롭게 학습한 내용을 다른 사람에게 설명할 수 있나요?

      - 네

 

오늘 학습한 내용 중 아직 이해되지 않은 불확실한 내용은 무엇인가요?

     -  없습니다.

 

이해되지 않은, 불확실한 내용을 보완하기 위해서 나는 무엇을 할 수 있을까요?

     -  구글링을 해본다.

 

나의 오늘 학습 만족도는 몇 점인가요?

     - 90점 (아는 내용들이라고 설렁설렁 넘어간 것들이 있는 것같다.)

반응형
Comments