티스토리 뷰

개인공부/백기선 선장 JAVA Study

class - 5 (클래스)

날따라해봐요요롷게 2021. 4. 27. 19:12

학습할 것 (필수)

  • 클래스 정의하는 방법
  • 객체 만드는 방법 (new 키워드 이해하기)
  • 메소드 정의하는 방법
  • 생성자 정의하는 방법
  • this 키워드 이해하기

과제 (Optional)

  • int 값을 가지고 있는 이진 트리를 나타내는 Node 라는 클래스를 정의하세요.
  • int value, Node left, right를 가지고 있어야 합니다.
  • BinrayTree라는 클래스를 정의하고 주어진 노드를 기준으로 출력하는 bfs(Node node)와 dfs(Node node) 메소드를 구현하세요.
  • DFS는 왼쪽, 루트, 오른쪽 순으로 순회하세요.

 

클래스

클래스란 객체를 정의하기 위한 하나의 틀이다.

클래스의 구성

- 필드 : 변수라고 칭한다. 필드는 객체의 속성을 보여준다. 필드는 (클래스 변수, 인스턴스 변수) 2가지가 있다.

- 메소드 : 메소도는 객체의 기능을 나타낸다. 메소드 또한 클래스, 인스턴스 메소드 2가지가 있다.

            - 인스턴스 메소드 : 인스턴스 메소드는 인스턴스가 생성되어 인스턴스를 통해 호출을 해야만 한다.

            - 클래스 메소드 : 클래스 메소드는 클래스 컴파일 시 메소드 메모리 구조에 올라간다. 따라서 해당 메소드는

            인스턴스 생성없이 호출이 가능하다.

public class Exp(){
	// 클래스 메소드사용
	static int x,y;
    
    static void add(int x, int y){
    	System.out.println(x+y);
    }
    
    public static void main(String args[]){
    	Exp.add(10,10); // 클래스 메소드 인스턴스 없이 사용 가능
    }
}

 

- 생성자 : 생성자는 객체가 생성된 직후 클래스의 객체를 초기화하는 역할을 한다. 리턴 값은 없다.

              따로 생성자를 정의하지 않으면 dafault 생성자가 실행된다.

- 초기화 블록 : 초기화 블록 내에서는 조건문, 반복문 등을 사용해 명시적 초기화에선 불가능한 초기화를 수행함.

public class ex_class1 {  // 클래스 정의!
	private int a;
	{ // 초기화 블록
		a = 10;
		System.out.println("초기화 블록");
	}
	ex_class1(){ // 생성자
		a =100;
		System.out.println("constructor");
	}
	public static void main(String[] args) {
		ex_class1 ex1 = new ex_class1();
		System.out.println(ex1.a); // 출력 : 초기화 블록 -> constructor -> 100
	}
}

 

많은 예로 드는 것이 붕어빵을 이야기한다. 붕어빵의 틀을 클래스라고 하고, 붕어빵 틀에 따라서 만들어지는 붕어빵을 객체라고 한다. 클래스를

 

public class ex_class1 {  // 클래스 정의!
	// 클래스의 속성을 나타내는 멤버변수 (field)
	int number1;
	String str;
	char chr;
	// 클래스의 기능을 보여주는 메소드 (method)
	public void function() {
		System.out.println("클래스의 기능 작동");
	}
}

이용하여 객체를 선언하고 생성하는 과정에서 이루어지는 용어와 메모리 구조도를 살펴보자.

 

#인스턴스

 : 클래스의 객체를 사용하기 위해서는 클래스를 선언, 생성이 이루어져야 한다.클래스를 선언하는 과정을 클래스의 인스턴스화라고 한다.

 

클래스 기반으로 생성된 객체를 인스턴스라고 한다. 인스턴스는 new 키워드로 객체가 생성되어 메모리에 올라간 객체를 말한다.

 

하나의 클래스는 여러 개의 인스턴스를 만들 수 있다. 하지만 각각의 인스턴스는 독립된 메모리 공간을 갖기에 개인의 필드를 갖는다. 객체마다 필드가 주어지는 것과 다르게 클래스의 메소드는 모든 인스턴스가 공유한다.

 

# 메모리 구조

객체의 선언과 생성과정을 설명하기 위해 크게 3개의 메모리 구조로 설명하겠다(메소드, 스택, 힙)객체를 선언하고 생성하는 과정에서 인스턴스가 만들어지고 메모리에 적재되는 곳이 어디인지를 살펴보자.

 

- 메소드 영역 : static 영역이라고도 한다.메소드 영역은 자바의 클래스 파일이 컴파일된 후 클래스데이터를 저장하는 영역이다.클래스 데이터로는 클래스 변수(static variable)가 있다.

 

- 힙 영역 :  힙 영역을 , 동적메모리 라고 한다.객체를 선언하고 생성하면 참조변수는 비 힙 영역의 "스택" 이라는 영역에 생겨난다.참조변수는 참조 값을 갖는데 참조 값은 스택 영역에 생겨난 생성한 객체의 필드의 주소 값을 가리킨다.

Student st1 = new Student();
st1.StudentName = "홍길동";
System.out.println(st1); // 출력 : 참조 값 (힙 영역의 주소를 가리킴)

힙 영역에서 인스턴스가 생성되고 인스턴스 변수가 생성된다.힙 영역은 GC가 메모리 관리를 하여 필요 없는 데이터를 지우는 역할을 한다.

 

 

- 스택 영역 : 메소드 작업에 필요한 메모리 공간을 제공해준다.메소드가 호출되면 메소드 실행시 필요한 변수들이 스택영역에 생성되고 사용된다.메소드가 종료되면 생성되었던 변수들도 모두 반환되어 사라진다.

 

객체 만드는 방법 (new 키워드 이해하기)

객체를 생성하기 위해서는 => 객체타입 객체변수이름 = new 객체타입(); 으로 생성한다.

 

메소드 정의하는 방법

메서드란 클래스의 기능을 보여준다.

메서드를 정의하는 방법을 알기 전에 제어자에 대해서 먼저 공부.

제어자란. 클래스나 멤버변수, 메소드를 선언시 부가적인 의미를 부여한다.

접근 제어자 : public, protected, default, private

기타 제어자 : static, final, abstract, transient, synchronized, volatile....

 

접근 제어자 : 접근 제어자는 클래스나 변수 선언시 사용하며, 특정 범위에서만 접근할 수 있도록 통제하는 역할을 한다. 클래스는 public과 default밖에 쓸 수 없다. default는 아무것도 덧붙이지 않았을 때를 의미한다.

접근 제어자 동일 클래스 동일 패키지 다른 클래스 그 외
private o x x x
default o o x x
protected o o o x
public o o o o

 

static - 변수, 메서드는 객체가 아닌 클래스에 속한다.
final - 클래스 앞에 붙으면 해당 클래스는 상속될 수 없다. -
       - 변수 또는 메서드 앞에 붙으면 수정되거나 오버라이딩 될 수 없다.
abstract - 클래스 앞에 붙으면 추상 클래스가 되어 객체 생성이 불가하고, 접근을 위해선 상속받아야 한다.
              변수 앞에 지정할 수 없다. 메서드 앞에 붙는 경우는 오직 추상 클래스 내에서의 메서드밖에 없으며 해당 메              서드는 선언부만 존재하고 구현부는 상속한 클래스 내 메서드에 의해 구현되어야 한다.

 

그렇다면 메서드 정의는 어떻게 하는가?

메서드는 

접근제어자 반환타입 메서드이름(매개변수){} -> 로 만들어진다.

public void add(int x)

 

this 키워드 이해하기

public class ex_class1 { 
	private int x,y,z;

	ex_class1(int x, int y){
		this.x = x;
		this.y = y;
	}
	ex_class1(int x, int y, int z){
		this(x, y); // this() 를 통해서 생성자 호출할 수 있다.
		this.z = z;
	}
	
	public static void main(String[] args) {
		ex_class1 ex1 = new ex_class1(100, 100, 101);
	}
}

this는 인스턴스 자신을 가리킨다. 따라서 지역변수 x, y를 구분지어준다.

this가 인스턴스를 가리키기 때문에 클래스 메서드에는 this를 사용할 수 없다. 인스턴스가 생성되지 않고 사용될 수도 있기 때문이다.

this() : 는 생성자를 호출하는 역할을 하기도 한다.

위의 코드를 살펴보면 두 번째 생성자에서 앞의 생성자를 호출하는 것을 볼 수 있다.

 

 

(참조 : jeeneee.dev/ 자바스터디)

'개인공부 > 백기선 선장 JAVA Study' 카테고리의 다른 글

class - 8 (인터페이스)  (0) 2021.05.11
class - 6 (상속)  (0) 2021.05.03
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함