5주차 과제: 클래스(필수)

2021. 1. 27. 16:53
728x90

목표

자바의 Class에 대해 학습하세요.

학습할 것 (필수)

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

과제 (Optional)

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

Class

 

  • 객체를 정의해 놓은 것, 객체의 설계도/틀
  • 속성과 기능으로 정의되어 있다.
  • 객체를 생성하는데 사용되며 객체는 클래스에 정의된 대로 생성된다.

 

클래스 작성규칙

 

  • 하나 이상의 문자로 이루어져야 한다.
  • 첫 번째 글자에는 숫자가 올 수 없다.
  • $,_ 외에는 특수문자 사용불가
  • 자바 명령어, 키워드는 사용할 수 없다.(while, for, int 등 사용불가)
  • 이름은 대소문자를 구분한다.(보통, 첫번째 글자는 대문자로 작성)


클래스의 구성

필드(field)

 

 클래스에 포함된 변수

 클래스 내에서 필드는 선언된 위치에 따라 구분됨.

 

  1. 필드(field) - 클래스내의 멤버 변수

  2. 매개 변수(parameter) -  메소드 선언에서의 변수

  3. 지역 변수(local variable) -  메소드, 블록 안에서 선언되는 변수

 

 

필드의 접근 제한

지시자 클래스내부 동일 패키지 상속받은 클래스 이외의 영역
private O X X X
default(no modifier) O O X X
protected O O O X
public O O O O

 

 

생성자(constructor)

클래스를 가지고 객체를 생성하면, 해당 객체는 메모리에 즉시 생성된다.

하지만 이렇게 생성된 객체는 모든 인스턴스 변수가 아직 초기화되지 않은 상태

따라서 자바에서는 객체의 생성과 동시에 인스턴스 변수를 원하는 값으로 초기화할 수 있는 생성자(constructor)라는 메소드를 제공한다.

자바에서 생성자(constructor)의 이름은 해당 클래스의 이름과 같아야 한다.

 

 

 

메소드(method) 
어떠한 특정 작업을 수행하기 위한 명령문의 집합

메소드를 사용하면 중복되는 코드의 반복적인 프로그래밍을 피할 수 있게 된다.

모듈화로 인해 전체적인 코드의 가독성이 좋아진다.

프로그램에 문제가 발생하거나 기능의 변경이 필요할 때도 손쉽게 유지보수를 할 수 있게 된다.

 

 

클래스 제어 지시자

 

 

public / defalut

 

접근제어자를 선언하지 않는다.

동일한 패키지 내에서만 접근가능 하다.

 

 

static

 

메소드나 변수를 메모리에 로딩해서 다른 클래스가 이 클래스의 인스턴스를 생성하지 않고도 사용할 수 있게 해준다

내부 클래스에서 사용 가능.

 

 

final

 

다른 클래스에서 이 클래스를 상속받을 수 없다.

 

 

abstract

 

하위 클래스에서 abstract method를 구현하게 한다.

 

 

 

 

클래스 정의 방법

 

public class className {

	//필드(멤버변수)
    int a;
    int b;

	// default 생성자
    public className(){}

	// 매개변수가 있는 생성자
    public className(int a, int b) {
        this.a = a;
        this.b = b;
    }

	// 메소드
    int sum(int a, int b){
        return a+b;
    }

    public static void main(String[] args) {
        //프로그램 시작
        
        className a = new className();
        a.sum(3,5);
    }
}

 

 

 

 

객체 만드는 방법 (new 키워드)

// 객체 생성 방법
클래스명 객체변수명 = new 클래스명();

// student 클래스
class Student {

	String name;
    int age;
    
    // 기본 생성자
    public Student(){}
    
    // 매개변수가 있는 생성자
    public Student( String name, int age){
    	this.name = name;
        this.age = age;
    }
    
    public static void main(String[] args){
    	
        // 기본생성자를 이용한 객체 생성
        Student s = new Student();
        
        // 매개변수가 있는 생성자를 이용한 객체 생성
        Student s2 = new Student("sujin", 20);
        
    }
    
}

 

new연산자란

new는 클래스 타입의 인스턴스(객체)를 생성해주는 역할을 담당한다. 여기에 조금 더 설명을 붙이면 new 연산자를 통해 메모리(Heap 영역)에 데이터를 저장할 공간을 할당받고 그 공간의 참조값(reference value /해시코드)을 객체에게 반환하여 주고 이어서 생성자를 호출하게 된다. 인스턴스를 핸들하기 위해서는 new 연산자를 통해 참조값을 저장한 객체로만 접근이 가능하다. 

 

 

 

객체 생성과정

 

메모리 할당 => 인스턴스 생성 => 주소값 생성

 

1. new 연산자가 s/s2객체에 저장될 메모리 공간 할당

2. 생성자가 s객체를 초기화

3. new 연산자가 새로 생성된 객체의 주소를 s/s2 변수에 저장

4. s/s2를 통해 Student에 접근 가능.

 

 

 

 

메소드 정의하는 방법

 

public static 리턴타입(자료형/void) 메소드명() {
	
    실행할 코드 작성
    return;   // 리턴타입이 void일 경우 return 생략
    
}

 

 

 

메소드의 리턴타입

메소드 내에서 동작하고 얻은 결과를 반환해주는 역할

return문 뒤에는 어떤한 구문도 올 수 없다.

return문은 리턴타입에 맞는 데이터를 반환해야함.

 

메소드 호출  =>  메소드명();

 

// sum 메소드 정의
public static int sum() {
        return 3+5;        
    }

public static void main(String[] args) {
    
    sum();   //실행결과 8
    
}

 

 

 

 

생성자 정의하는 방법

 

 

생성자란

객체가 메모리에 할당될 때마다 자동으로 실행되는 메소드를 의미

객체가 생성될 때 한번 호풀되는 메소드이며, 리턴형이 없고 클래스명과 함수명이 같다.

반드시 public이라는 수식어가 붙어야 하며

하나의 클래스에 여러개의 생성자가 존재할 수도 있다.

 

public 클래스명 (초기화 할 변수) {

	인스턴스 변수 초기화 명령문
    
}

 

 

기본 생성자(디폴트 생성자)

매개변수가 없는 생성자를 의미

 

 

매개변수를 갖는 생성자

생성자에 매개변수가 있는 생성자를 의미

 

class Student{

	String name;
    int age;
	
    //기본 생성자
	public Student() {}
    
    //매개변수를 갖는 생성자
    public Student(String name, int age){
    	
        this.name = name;
        this.age = age;
    }

 

 

 

this 키워드 이해하기

 

this키워드는 인스턴스 자기 자신을 가리키는 키워드이다.

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

=> 클래스를 기반으로 생성된 인스턴스를 가리키는 참조, 인스턴스 자체와는 다르다.

 

public class Student {
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

this키워드를 이용하여 작성한 클래스 코드로, this란 키워드를 통해 생성자 및 세터,게터메소드에서

이 클래스를 기반으로 생성된 인스턴스의 필드 데이터에 접근할 수 있다.

 

 

 

 


참고

 

www.tcpschool.com/java/java_class_component

brunch.co.kr/@yoonsung/1

velog.io/@max9106/Java-%ED%81%B4%EB%9E%98%EC%8A%A4Class

devfunny.tistory.com/217

m.blog.naver.com/PostView.nhn?blogId=heartflow89&logNo=220955262405&proxyReferer=https:%2F%2Fwww.google.com%2F

m.blog.naver.com/PostView.nhn?blogId=heartflow89&logNo=220951776433&proxyReferer=https:%2F%2Fwww.google.com%2F

neul-carpediem.tistory.com/32

engkimbs.tistory.com/873

728x90

BELATED ARTICLES

more