티스토리 뷰

728x90
반응형

목표

자바의 Class에 대해 학습하기.

 

스터디 목차

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

 

과제 (Optional)

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

 

 

1. 클래스 정의하는 방법

 

객체지향 프로그래밍(OOP, Object-Oriented Programming) 이란?

모든 데이터를 객체(object)로 취급하며, 이러한 객체가 바로 프로그래밍의 중심이 된다.

 

클래스(class)

자바에서 클래스란 객체를 정의하는 틀 또는 설계도와 같은 의미로 사용된다.

클래스는 객체의 상태를 나타내는 필드(field)와 객체의 행동을 나타내는 메소드(method)로 구성된다.

즉, 필드란 클래스에 포함된 변수를 의미하고, 메소드는 어떠한 특정 작업을 수행하기 위한 명령문의 집합이다.

 

public class Main { // 클래스 정의
    static public void main(String[] args) {

   }
}

 

 

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

 

객체란?

객체지향 프로그래밍에서 데이터(특성)와 그 데이터에 관련되는 동작(절차, 방법, 기능 - 로직)이 결합된 것 을 객체라 한다.

한 클래스로부터 제각각 다른 객체들을 만들어 낼 수 있다. 

 

new 연산자란?

클래스 타입의 인스턴스(객체)를 생성해주는 역할을 한다.

new 연산자를 통해 메모리(Heap) 영역에 데이터를 저장할 공간을 할당받는다. heap은 참조형 공간으로써 해제 하기전까지 할당된 메모리는 삭제되지 않는다.

 

new 연산자로 객체를 만들게 되면 생성자를 호출하여 객체를 초기화 한다. 생성자가 종료되면 new 연산자는 생성된 객체에 접근할 수 있도록 reference(객체에 대한 주소, 식별자)를 반환한다.

 

클래스명 객체변수명 = new 클래스명();

 

만약 new 연산자를 사용하지 않는다면

hu는 저장 공간이 없이 null 값을 갖고 tst.name, tst.age는 불가 하다.

Human hu;
hu.name = "홍길동";
hu.age = 20;
System.out.println("이름=" + hu.name);

 

 

 

 

3. 메소드 정의하는 방법

 

메소드(method)란?

어떠한 문제를 처리하기 위한 방법을 소스코드로 묶어놓고 필요(호출)에 따라 동작하는 기능이다.(함수라고도 불린다.)

 

타입지정자 리턴타입 메소드명(매개변수) { // 메소드 선언
    실행할 코드 작성;
    return; // 리턴타입이 void일 경우 return 없다.
}

 

main 메소드

main 메소드는 프로그램의 시작점 역할을 하는 JAVA의 약속된 내용이다. 즉, main 메소드가 없는 프로그램은 별도로 동작할 수가 없다. 컴퓨터가 소스코드를 읽을때 main 메소드를 실행하고 거기에 정의된 로직에 따라 프로그램이 동작하게 된다.

 

메소드 리턴타입

메소드의 리턴타입은 자료형 또는 void가 올 수 있다. 자료형이 리턴 타입으로 오면 반환(return)해 주는 값(메소드 자료형과 동일한 값)이 반드시 있어야 하고 리턴이 필요없는 경우에는 리턴타입을 void로 하면된다.

 

리턴(return)문

메소드 내에서 동작하고 얻은 결과(필요한 데이터)를 반환해주는 역할을 한다. return문 뒤에는 어떠한 구문도 올 수 없다. (컴파일 에러 발생) 다르게 말하면 return문을 사용하면 값을 반환해 주고 해당 메소드는 실행이 종료된다.

 

메소드 매개변수

메소드의 매개변수(parameter)란 외부로부터 입력 값을 받기 위해 메소드의 괄호 안에 선언하는 변수이다.

main메소드에서 다른 메소드를 호출할 때 값을 전달하여 전달된 값에 따라 처리될 수 있도록 하는 기능이다.

 

 

 

4. 생성자 정의하는 방법

 

생성자(Constructor)

생성자는 new 연산자를 통해서 인스턴스를 생성할 때 반드시 호출이 되고 제일 먼저 실행되는 일종의 메소드이다.

생성자는 인스턴스 변수(필드 값 등)를 초기화 시키는 역할을 한다.

 

생성자의 조건

  • 생성자의 이름은 클래스의 이름과 같아야한다.
  • 생성자는 리턴 값이 없다.
  • 생성자도 오버로딩이 가능하므로 하나의 클래스에 여러 개의 생성자가 있을 수 있다.
  • 생성자도 메소드이기 때문에 리턴값이 없다는 의미의 void를 적어야 하지만, 모든 생성자가 리턴값이 없으므로 void를 생략하도록 한 것이다.

 

1) 기본생성자 (default Constructor)

모든 클래스는 생성자가 반드시 존재하며, 하나 이상을 가질 수 있다.

클래스 내부에 생성자가 한개도 선언이 되어 있지 않다면 컴파일러는 기본생성자를 바이트 코드에 자동 추가시킨다.

 

Car() { // 기본생성자

}

Car car = new Car();

 

2) 매개변수가 있는 생성자

생성자는 메소드와 비슷한 모양을 가지고 있으나, 리턴 타입이 없고 클래스 이름과 동일해야 한다.

생성자도 메소드처럼 매개변수를 선언하여 호출 시 값을 넘겨받아 인스턴스의 초기화에 사용할 수 있다.

인스턴스마다 각기 다른 값으로 초기화되어야 하는 경우가 많기 때문에 매개 변수를 사용한 초기화는 매우 유용하다.

 

Car(String model){
  this.model = model
}

Car car = new Car("자가용");

 

3) 생성자 오버로딩

외부의 다양한 데이터를 이용해 객체를 초기화 하려면 생성자도 다양화될 필요가 있다.

생성자 오버로딩을 통해 매개변수를 달리하여 생성자를 여러 개 선언하여 다양화할 수 있다.

일반 메소드 오버로딩과 똑같다고 볼 수 있다.

 

Car(String model){
  this.model = model;
}

Car(String model, String color){
  this.model = model;
  this.color = color;
}

 

4) 생성자에서 다른 생성자 호출

생성자 오버로딩이 많아질 경우 생성자 간의 중복된 코드가 발생할 수 있기 때문에

나머지 생성자는 초기화 내용을 가지고 있는 생성자를 호출하는 방법으로 개선할 수 있다.

생성자에서 다른 생성자를 호출할 때에는 this()코드를 사용한다.

this()호출은 반드시 생성자의 첫 줄에서만 호출이 가능하다.

 

Car(String model){
  this(model, null, 0);
}

Car(String model, String color){
  this(model, color, 0);
}

Car(String model, String color, int maxSpeed) {
  this.model = model;
  this.color = color;
  this.maxSpeed = maxSpeed;
}

 

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

현재 사용하고 있는 인스턴스와 같은 상태를 갖는 인스턴스를 하나 더 만들고자 할 때 생성자를 이용할 수 있다.

복사하여 서로 같은 상태를 갖지만, 서로 독립적으로 메모리 공간에 존재하는 별도의 인스턴스 이므로 값들이 변경되어도 서로 영향받지 않는다.

 

Car(Car c){
  color = c.color;
  gearType = c.gearType;
  door = c.door;
}

Car(String color, String gearType, int door){
  this.color = color;
  this.gearType = gearType;
  this.door = door;
}

Car c1 = new Car();
Car c2 = new Car(c1);

 

 

 

5. this 키워드 이해하기

 

this

자바에서 제공하는 this 키워드는 인스턴스 자기 자신을 가리키는 키워드이다.

이 this 키워드를 통해 클래스 메소드 및 생성자에서 자기 자신의 데이터를 업데이트 하거나 조작할 수 있습니다.

중요한 것은 this 키워드는 이 클래스를 기반으로 생성된 인스턴스를 가리키는 참조라는 사실이다.

인스턴스를 가르키는 참조와 인스턴스 자체는 다르다는 것을 알아두자.

 

int age;  // 필드

void setAge(int age){ // 메소드
  this.age = age;
}

 

위와 같이 인자값의 변수명과 필드의 변수명이 같아도 this를 활용하면 같이 사용이 가능하다.

this.age는 필드인 age를 의미한다. 즉, this의 뒤의 변수명은 매개변수가 아닌 멤버변수(필드)를 의미한다.

 

 

 

과제 (Optional)

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

 

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

public class BinrayTree {
    public static void main(String[] args){
        BinrayTree binrayTree;
        Node node1 = new Node(4,null,null);
        Node node2 = new Node(5, null, null);
        Node node3 = new Node(2, node1, node2);
        Node node5 = new Node(6, null,null);
        Node root = new Node(1,node3,node5);
        binrayTree = new BinrayTree(root);

        binrayTree.dfs(binrayTree.rootNode);
        binrayTree.bfs(binrayTree.rootNode);
    }
    Node rootNode;
    Queue<Node> Q = new LinkedList();

    public BinrayTree(Node rootNode){ // root 노드가 있어야 시작을 한다
        this.rootNode = rootNode;
    }

    public void dfs(Node root){ // 깊이 우선 탐색 inorder방식으로 구현
        if(root.left != null){
            dfs(root.left); // 왼쪽에 값이 있으면 들어간다
            root.left=null; // 나왔으면 연을 끊는다.
        }

        // 왼쪽이 null 일때가 root를 찍어야 할때 이므로 값을 출력
        // postorder는 출력문이 맨뒤에 preorder는 출력문이 맨앞에 있어야한다. inorder이라 중간에 위치
        System.out.println(root.value);

        // 출력하고나서 오른쪽 본다.
        if(root.right != null){
            dfs(root.right); // 오른쪽에 값이 있으면 들어가 오른쪽 자식의 왼쪽을 봐야한다.
            root.right=null; // 나왔으면 연을 끊는다.
        }
    }

    public void bfs(Node root){ // 넓이 우선 함색
        if(root == null){ // 맨 마지막에 재귀호출할때는 null을 주는데 그때 종료하기 위해
            return;
        }
        if(Q.isEmpty()){ // 처음 호출할떄만 동작
            Q.add(root);
        }
        Node poll = Q.poll(); // 맨 앞의 큐에서 값을 꺼낸다.
        System.out.println(poll.value); // 출력하고
        if(poll.left != null){ // 좌우가 있는지 확인하고 있으면 큐에 넣는다.
            Q.add(poll.left);
        }
        if(poll.right != null){
            Q.add(poll.right);
        }
        bfs(Q.peek()); // 큐의 맨 앞 값을 넣는다.
    }
    public static class Node{
        int value;
        Node left;
        Node right;

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

}

 

 

 

 

 

 

Reference


 

nukestorm.tistory.com/79

 

자바 클래스(class) 2. 객체의 정의와 생성방법(new 연산자)

  객체의 정의 객체 지향 프로그래밍에서  데이터(특성)와 그 데이터에 관련되는 동작(절차, 방법, 기능 - 로직)이 결합된 것을 객체(object, instance)라 한다.   객체는 데이터와 로직을 묶어놓은

nukestorm.tistory.com

blog.naver.com/PostView.nhn?blogId=heartflow89&logNo=220951776433&parentCategoryNo=&categoryNo=&viewDate=&isShowPopularPosts=false&from=postView

 

[JAVA/자바] 메소드(method) 정의(선언 및 호출)

지금까지는 자바의 기본적인 내용(변수, 조건문, 반복문, 배열 등)에 대해서 알아보았다. 앞으로 알아볼 내...

blog.naver.com

programmer-seva.tistory.com/79

 

[스터디_자바 기본] 21. 생성자(Constructor)

생성자(Constructor)는 new 연산자와 같이 사용되어 클래스로부터 객체를 생성할 때 호출되어 객체의 초기화를 담당한다. 인스턴스 변수의 초기화 작업에 주로 사용되며, 인스턴스 생성 시에 실행되

programmer-seva.tistory.com

github.com/ChoiGiSung/JavaStudy/blob/main/5%EC%A3%BC%EC%B0%A8.md

 

ChoiGiSung/JavaStudy

whiteship님 온라인 study. Contribute to ChoiGiSung/JavaStudy development by creating an account on GitHub.

github.com

 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
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