클래스

파이 ఇ·2023년 5월 31일
1
post-thumbnail

💡 목표 : 자바의 Class에 대해 학습해보자.

⚡️ 목차

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

⚡️ 과제

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

클래스란 무엇인가?

클래스가 무엇인지에 대해 앞서, 자바에 대해 설명해보자면 자바 프로그래밍은 OOP (객체 지향 프로그래밍)라고 한다. 현실 세계에서도 어떠한 제품을 만들 때 여러가지 부품들을 조합해서 제품을 만들어 내듯이 여러가지 객체(Object)를 각각 만들어서 하나로 조립하는 프로그래밍 기법을 객체 지향 프로그래밍 기법이라고 한다. 자바에서 객체는 클래스를 통해 만들어 낼 수 있다. 자바에서는 클래스(Class)란 객체를 정의하는 틀 또는 설계도와 같은 의미로 사용된다. 자바에서는 이러한 설계도인 클래스를 가지고, 여러 객체를 생성하여 사용하게 된다. 클래스는 객체의 상태를 나타내는 필드(Field)와 객체의 행동을 나타내는 메서드(Method)로 구성된다. 또한 메서드란 어떤 특정 작업을 수행하기 위한 명령문의 집합이라고 할 수 있다.

클래스 구조

클래스의 구성 멤버설 명
필드 (field)객체의 데이터가 저장되는 곳
생성자 (Constructor)new 연산자로 호출되는 메서드로 객체 생성 시 필드의 초기화 담당
메서드(Method)객체의 동작에 해당하며 클래스의 다양한 동작을 구성

클래스를 정의하는 방법

class 클래스명 { }
Class Student {
	//필드
    String name;
    int age;
    int korean_score;
    int math_score;
    int english_score;
    
    //생성자
    public Student (String name, int age, int kor_score, int mat_score, int eng_score) {
    	this.name = name;
        this.age = age;
        this.korean_score = kor_score;
		this.math_score = mat_score;
		this.english_score = eng_score;
     }
     
     //메서드
     public void printScore() {
		System.out.println("이름 : " + name);
		System.out.println("나이 : " + age);
		System.out.println("국어성적: " + korean_score);
		System.out.println("수학성적 : " + math_score);
		System.out.println("영어성적: " + english_score);
	}
}

클래스는 위와 같이 class 클래스명 {}과 같은 형태로 만들어서 내부에 필드, 생성자, 메서드를 정의하면 된다. 추가로 생성자와 메서드는 오버로딩이 가능하다. 이렇게 생성된 클래스는 하나의 객체 설계도라고 생각하면 되고 이렇게 정의된 클래스를 통해 동일한 객체를 무한정 찍어낼 수 있다. 이렇게 찍어낸 객체를 인스턴스라고 한다. 쉽게 말해 클래스는 붕어빵 틀 인스턴스는 붕어빵이라고 생각하면 이해가 좀 더 수월하다 !

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

public class Main {
	public static void main(String[]args) {
    	
        //생성자가 없는 경우
        Student student1 = new Student(); // 인스턴스 생성
        
        //생성자가 있는 경우
        Student student2 = new Student("홍길동", 18, 100, 90, 80);
        
        student2.printScore();
    }
}

➡️ 출력결과
인스턴스를 생성 한 뒤 클래스에 정의되어있는 메서드를 호출하려면 위처럼.을 이용하여 메서드를 호출해 사용하면 된다.

클래스를 통해 객체를 생성하기 위해서는 new 연산자를 사용하면 된다.new 연산자 뒤에는 생성자가 오는데, 생성자는 클래스() 형태를 가지고 있으며 생성자의 여부에 따라 인자값을 맞춰 넣으면 된다. 이렇게 new 연산자로 생성된 객체는 힙 메모리 영역에 생성되며 이렇게 만들어진 객체를 인스턴스(instance)라고 한다.

메서드를 정의하는 방법

위에서 말했듯 메서드는 객체의 동작에 해당되며 클래스의 다양한 동작을 구성한다. 메서드를 정의하는 방법은 다음과 같다.

//선언부
접근제어자 반환타입 메서드이름 (매개변수의 목록) {
		//구현부
}
  1. 접근 제어자 : 해당 메서드에 접근할 수 있는 범위를 명시한다.
  2. 반환 타입(return type) : 메서드가 모든 작업을 마치고 반환하는 데이터 타입을 명시한다.
  3. 메서드 이름 : 메서드를 호출하기 위한 이름을 명시한다.
  4. 매개변수 목록(parameters) : 메서드 호출 시 전달되는 인수의 값을 저장 할 변수들을 명시한다.
  5. 구현부 : 메서드의 고유 기능을 수행하는 명령문의 집합.

자바에서는 하나의 클래스에 같은 이름의 메서드를 둘 이상 정의 할 수 없다. 하지만 메서드 오버로딩(Overloading)을 이용하면, 같은 이름의 메서드를 중복하여 정의 할 수 있다. 메서드를 오버로딩 함으로써 메서드에 사용되는 이름을 절약 할 수 있다. 또한 메서드를 호출할 때 전달해야 할 매개변수의 타입이나 개수에 대해 크게 신경쓰지 않고 호출 할 수 있게 된다!
*메서드 오버로딩? 매개변수의 개수나 타입을 다르게하여 같은 이름의 또 다른 메서드를 작성하는것.

생성자를 정의하는 방법

인스턴스 변수의 초기화

클래스를 가지고 객체를 생성하면, 해당 객체는 메모리에 즉시 생성된다. 하지만 이렇게 생성된 객체는 모두 인스턴스 변수가 아직 초기화가 되지 않은 상태. 자바에서는 클래스 변수와 인스턴스 변수는 별도로 초기화하지 않으면, 다음 값으로 자동 초기화된다.

변수의 타입초기값
char'\u0000'
byte, short, int0
long0L
float0.0F
double0.0 또는 0.0D
booleanfalse
배열, 인스턴스 등null

생성자

자바에서는 객체의 생성과 동시에 인스턴스 변수를 원하는 값으로 초기화 할 수 있는 생성자(Constructor)라는 메서드를 제공한다. 자바에서는 생성자의 이름은 해당 클래스의 이름과 같아야 한다. 즉 Car클래스의 생성자 이름은 Car가 된다. 이러한 생성자는 다음과 같은 특징을 가진다.

  1. 생성자는 반환값이 없지만, 반환 타입을 void형으로 선언하지 않는다.
  2. 생성자는 초기화를 위한 데이터를 인수로 전달 받을 수 있다.
  3. 객체를 초기화하는 방법이 여러개 존재 할 경우에는 하나의 클래스가 여러개의 생성자를 가질 수 있다. 즉, 생성자도 하나의 메서드 이므로 메서드 오버로딩이 가능하다는 의미.

생성자의 선언

자바에서는 클래스 생성자를 선언하는 문법은 다음과 같다.

1. 클래스 이름() {..}                // 매개변수가 없는 생성자 선언
2. 클래스 이름(인수1, 인수2, ..) {..}  // 매개변수가 있는 생성자 선언

this

this 참조 변수는 인스턴스가 바로 자기 자신을 참조하는데 사용하는 변수이다. 이러한 this 참조 변수는 해당 인스턴스의 주소를 가르키고 있다.

class Car {
	//필드
    private String modelName;
    private int modelYear;
    private String color;
    private int maxSpeed;
    private int currentSpeed;
    
    Car(String modelName, int modelYear, String color, int maxSpeed) {
    	this.modelName = modelName;
        this.modelYear = modelYear;
		this.color = color;
		this.maxSpeed = maxSpeed;
		this.currentSpeed = 0;
    }

위 예제처럼 생성자의 매개변수 이름과 인스턴스 변수의 이름이 같을 경우에는 인스턴스 변수 앞에 this 키워드를 붙여 구분한다. 이렇게 자바에서는 this 참조 변수를 사용하여 인스턴스 변수에 접근 할 수 있다. 이러한 this 참조 변수를 사용할 수 있는 영역은 인스턴스 메서드 뿐이며, static 메서드에서는 사용 할 수 없다. 모든 인스턴스 메서드에는 this 참조 변수가 숨겨진 지역 변수로 존재하고 있다.

this() 메서드

this() 메서드는 생성자 내부에서만 사용할 수 있으며, 같은 클래스의 다른 생성자를 호출 할 때 사용한다. this() 메서드에 인수를 전달하면, 생성자 중에서 메서드 시그니처가 일치하는 다른 생성자를 찾아 호출해준다.

class Car {
	private String modelName;
	private int modelYear;
	private String color;
	private int maxSpeed;
	private int currentSpeed;
    
   Car(String modelName, int modelYear, String color, int maxSpeed) {
		this.modelName = modelName;
		this.modelYear = modelYear;
		this.color = color;
		this.maxSpeed = maxSpeed;
		this.currentSpeed = 0;
    }
    
    Car() {
    	this("소나타", 2012, "검정색", 160); // 다른 생성자를 호출함.

이렇게 내부적으로 다른 생성자를 호출하여 인스턴스 변수를 초기화 할 수 있다.

⚡️ 과 제

않이.. 여기서 갑자기 이진트리가 왜 나와 난 어떡하라구 진짜..

이진트리(BinaryTree)


부모 노드(parent node) : 자기 자신(노드)과 연결된 노드 중 자신보다 높은 노드를 의미 (ex. F의 부모 노드 : B)
자식 노드(child node) : 자기 자신(노드)과 연결된 노드 중 자신보다 낮은 노드를 의미 (ex. C의 자식 노드 : G,H)
루트노드 (root node) : 일명 뿌리 노드라고 하며 루트 노드는 하나의 트리에선 하나밖에 존재하지 않고, 부모 노드가 없다 위 이미지에선 녹색 이 뿌리노드
단말 노드 (leaf node) : 리프 노드라고도 불리며 자식 노드가 없는 노드를 말한다 위 이미지에선 주황색 노드가 단말 노드
내부 노드 (internal node) : 단말 노드가 아닌 노드
형제 노드 (sibling node) : 부모가 같은 노드를 말한다. (ex.D,E,F는 모두 부모 노드가 B이므로 D,E,F는 형제노드)
깊이(depth) : 특정 노드에 도달하기 위해 거쳐야 하는 ‘간선의 개수’를 의미(ex. F의 깊이: A→ B→ F 이므로 깊이: 2)
레벨 (level) : 특정 깊이에 있는 노드들의 집합을 의미하며, 구현하는 사람에 따라 0또는 1부터 시작
차수 (degree) : 특정 노드가 하위(자식)노드와 연결 된 개수 (ex.B의 차수 3 {D,E,F} )

이진트리 구현하기

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

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

	public int getValue() {
			return value;
	}
    
	public Node getLeft() {
		return left;
	}

	public Node getRight() {
		return right;
	}
}
public class BinaryTree {

	public void dfs(Node node) {
		if (node == null) {
			return;
		}
		dfs(node.getRight());
		System.out.println(node.getValue() + " ");
		dfs(node.getLeft());
	}

	public void bfs(Node node) {
		if (node == null) {
			return;
		}
		Queue<Node> queue = new ArrayDeque<>();
		queue.offer(node);
		while (!queue.isEmpty()) {
			traverse(queue);
		}
	}

	public void traverse(Queue<Node> queue) {
		Node poll = queue.poll();
		if (poll != null) {
			System.out.println(poll.getValue() + " ");
			getChild(queue, poll.getLeft());
			getChild(queue, poll.getRight());
		}
	}

	private void getChild(Queue<Node> queue, Node child) {
		if (child != null) {
			queue.add(child);
		}
	}
}

[참조]
https://velog.io/@youngerjesus/%EC%9E%90%EB%B0%94-%ED%81%B4%EB%9E%98%EC%8A%A4#4-%EC%83%9D%EC%84%B1%EC%9E%90-%EC%A0%95%EC%9D%98%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95
http://www.tcpschool.com/java/java_methodConstructor_this
https://st-lab.tistory.com/300

profile
⋆。゚★⋆⁺₊⋆ ゚☾ ゚。⋆ ☁︎。₊⋆

0개의 댓글