Java/라이브스터디

클래스

목표

자바의 Class에 대해 학습하시오.

학습할 것

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

과제

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

 


 

클래스 정의방법

[접근 제한자] class [클래스명]{
  //필드, 생성자, 메소드 정의
}

클래스란 자바에서의 모든 작업이 일어나는 공간을 의미합니다.

클래스 내부는 필드, 생성자, 메소드가 존재합니다.

  • 필드 : 클래스내의 변수
  • 생성자 : 클래스의 객체 생성 시에 초기화를 담당하는 코드블록
  • 메소드 : C/C++에서의 함수

 

public class MyClass{
  public int field_Val;
  // 필드

  Myclass(){

  } 
  // 생성자

  public void Method(){
    /* Something.. */
  }
  // 메소드
}

클래스의 정의시에 접근제한자를 사용할 수 있으며, 아래와 같은 키워드가 존재합니다.

  • private
  • protected
  • public

추가적으로 클래스간에는 상속이 가능하며, extends 키워드를 사용하여 이루어집니다.
추상메소드만으로 이루어진 클래스는 interface라고 부르며 implements 키워드를 사용하여 상속합니다.

 

필드

클래스내에서 사용가능한 변수를 의미합니다.

[접근제한자] [타입] [변수명];

=== 예시 ===

public Integer int_Val;

일반적으로 위와 같은 틀로 선언하며, 선언과 동시에 초기화하는 것도 가능합니다.
접근제한자의 따라 해당 변수의 접근권한이 결정됩니다.

클래스내의 메소드나 생성자에서 해당 클래스의 변수에 접근할떄는 this키워드를 사용합니다.

 

생성자

클래스의 필드를 초기화하는 목적으로 사용됩니다.

 

[접근 제한자] [클래스명](/*파라미터*/){

}

=== 예시 ===

class Myclass{
  public Mycalss(){

  }

  public Myclass(int data){

  }
}

메소드와는 다른 개념으로 리턴타입이 존재하지 않고, 해당 클래스명을 가지고 선언 및 호출합니다.

 

메소드

C/C++에서의 함수역할을 맡고 있습니다.

[접근 제한자] [리턴 타입] [메소드 명](/*파라미터*/){

}

=== 예시 ===

public void Method(String str){
  System.out.println(str);
}

객체를 사용한 메소드의 호출은 객체명.메소드명(); 으로 호출하며, 클래스 내에서의 호출은 this 키워드를 사용합니다.

리턴타입이 void가 아닌경우 반드시 해당 타입의 값을 반환해야합니다.

 

객체 생성방법

[Class 명] [참조변수 명] = new [Class 생성자];

객체란, 클래스를 토대로 할당된 메모리에 참조가 가능한 변수를 의미합니다.
클래스의 객체는 new 키워드와 해당 클래스의 생성자를 통하여 할당받을 수 있습니다.

new 키워드는 자바에서 객체를 생성하는 연산자의 역할을 맡고있습니다.

 

예시를 통해 객체의 생성과정을 알아봅시다.

public class MyClass{
  public int int_val;
  public String name;

  MyClass(){
    this.int_val = 0;
    this.name = null;
  }

  MyClass(int int_val, String name){
    this.int_val = int_val;
    this.name = name;
  }

  public void Method(){
    System.out.println(int_val + name);
  }
}

public class Start{
  public static void main(String[] args){
    MyClass myclass = new MyClass(10,"object");
  }
}

 

 

main 메소드에 진입 하기전의 메모리 상태는 위 이미지와 같습니다.
현재 상태에서 main 메소드의 Myclass myclass가 실행되면 아래의 이미지가 됩니다.



 

Myclass 타입의 myclass라는 참조변수가 메인메소드의 스택프레임에 할당됩니다.



 

이후 new Myclass(10, "object") myclass에 할당되면 이런 이미지가 됩니다.

즉, new키워드를 통해 생성자에 따라 Heap영역에 메모리를 할당하고 해당 메모리의 주소를 객체가 참조하는 형식이 됩니다.

객체를 이용하여 클래스의 요소에 접근하는 방법은 myclass.Method()와 같이 객체명.클래스 요소를 이용하여 접근할 수 있습니다.

 

this 키워드

클래스에서의 this 키워드는 클래스 자기자신을 의미합니다.

 

public Myclass{
  int INT_VAL;
  String name;

  Myclass(){
    INT_VAL = 0;
    name = null;
  }

  MyClass(int INT_VAL, String name){
    this.INT_VAL = INT_VAL;
    this.name = name;
  }

  public void Method(){

  }
}

위와 같은 클래스에서의 this 키워드는 다음과 같은 의미를 가집니다.

 

this.INT_VAL // Myclass.INT_VAL 필드 접근
this.name // Myclass.name 필드 접근
this() // Myclass() 생성자 호출
this(10, "object") // Myclass(int INT_VAL, String name) 생성자 호출
this.Method() // Myclass.Method() 메소드 호출

 

이진트리 정의 및 순회하기

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


import java.util.LinkedList;
import java.util.Queue;

public class Node {
    int value;
    Node left, right;

    public Node(int value){
        this.value = value;
        left = null;
        right = null;
    }

    public Node InsertNode(Node root, Node node){
        Queue<Node> queue = new LinkedList<Node>();

        Node ROOT = root;
        queue.add(ROOT);

        while(!queue.isEmpty()){
            Node Seeker = queue.poll();

            if(Seeker.left == null){
                Seeker.left = node;
                break;
            }else if(Seeker.right == null){
                Seeker.right = node;
                break;
            }

            queue.add(Seeker.left);
            queue.add(Seeker.right);
        }
        return root;
    }
}

Node클래스

 

 

package BinaryTree;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;

public class BinaryTree {
    ArrayList<Integer> ForDFS_TEST = new ArrayList<>();

    public ArrayList<Integer> bfs(Node node){
        Queue<Node> queue = new LinkedList<Node>();
        queue.add(node);

        ArrayList<Integer> ret = new ArrayList<>();

        while(!queue.isEmpty()){
            Node now = queue.poll();

            ret.add(now.value);

            if(now.left != null)
                queue.add(now.left);

            if(now.right != null)
                queue.add(now.right);
        }

        return ret;
    }

    public void dfs(Node node){
        if(node.left != null)
            dfs(node.left);

        ForDFS_TEST.add(node.value);

        if(node.right != null)
            dfs(node.right);
    }
}

BinaryTree 클래스

 

 

package BinaryTree;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import java.util.ArrayList;

import static org.junit.jupiter.api.Assertions.*;

class BinaryTreeTest {

    Node root;
    BinaryTree BT;
    @BeforeEach
    public void setting(){
        root = new Node(10);
        BT = new BinaryTree();

        root = root.InsertNode(root, new Node(20));
        root = root.InsertNode(root, new Node(30));
        root = root.InsertNode(root, new Node(40));
        root = root.InsertNode(root, new Node(50));
        root = root.InsertNode(root, new Node(60));
        root = root.InsertNode(root, new Node(70));
    }

    @Test
    void bfs() {
        ArrayList<Integer> result = BT.bfs(root);

        ArrayList<Integer> Check = new ArrayList<>();
        Check.add(10);
        Check.add(20);
        Check.add(30);
        Check.add(40);
        Check.add(50);
        Check.add(60);
        Check.add(70);

        assertEquals(true,Check.equals(result));
    }

    @Test
    void dfs() {
        BT.dfs(root);

        ArrayList<Integer> Check = new ArrayList<>();
        Check.add(40);
        Check.add(20);
        Check.add(50);
        Check.add(10);
        Check.add(60);
        Check.add(30);
        Check.add(70);

        assertEquals(true, Check.equals(BT.ForDFS_TEST));
    }
}

테스트코드

 

참고 자료