Develop/java

[백기선님의 자바 라이브 스터디] 5주차 - 클래스

에디개발자 2021. 1. 4. 07:00
반응형

www.youtube.com/watch?v=HLnMuEZpDwU 

나를 닮았다고 한다...

목표

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

학습할 것 (필수)

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

클래스

클래스란 변수와 메서드 집합체이며, 객체를 정의하는 설계도입니다. 

객체란?
자바는 객체지향 프로그램입니다. 객체지향 프로그램에서 모든 데이터를 객체로 취급합니다.

하나의 예로 스토어가 있고 스토어에서 일하는 직원들이 있다고 가정해보겠습니다. 아래의 코드를 참조해주세요.

public class StoreClass {
    private String storeName;       // 변수  
    private String address;         // 변수

    /**
     * 메서드
     * @return
     */
    public String getStoreName() {
        return this.storeName;
    }

    // 그 외에 스토어 관련 로직
}
public class EmployeeClass {
    private String employeeName;        // 변수
    private String phone;               // 변수
    private String email;               // 변수

    /**
     * 메서드
     * @return
     */
    public String getEmployeeName() {
        return employeeName;
    }

    // 그외 임직원 로직
}

스토어는 스토어 관련 필드 (변수) 및 관련 로직인 메서드로 설계되어 있습니다. 이처럼  클래스는 클래스가 수행하려는 객체들의 집합, 즉 객체들로 설계되어 있습니다.

 

클래스 정의하는 방법

클래스를 정의할 때 접근 지정자를 지정할 수 있습니다.

접근 지정자 클래스 내부 동일 패키지 하위 클래스 그 외
public O O O O
protected O O O X
default O O X X
private O X X X

 

Integer 클래스로 정의하는 방법에 대해서 알아보겠습니다.

public final class Integer extends Number implements Comparable<Integer> {
    // ...
}
  • public : 클래스의 접근 지정자를 설정한 부분입니다. Integer는 어디서든 클래스를 사용할 수 있습니다.
  • final : 해당 클래스는 재정의할 수 없습니다. 다른 말로는 상속이 불가능합니다.
  • class : 클래스로 정의한 것입니다.
  • Integer : 클래스의 명을 Integer로 설정합니다.
  • extends : Number 클래스를 상속받아서 사용합니다.
  • implements : Complarable<Integer>의 인터페이스를 구현합니다. ( 다수 설정 가능 )

여기서 extends와 implements에 대해서 알아보겠습니다.

extends

기능이 구현되어 있는 클래스를 상속받아서 상속받은 클래스의 변수, 메서드를 접근 지정자에 따라서 사용할 수 있습니다.

public class StoreClass extends Object {
    private String storeName;       // 변수
    private String address;         // 변수

    /**
     * 메서드
     * @return
     */
    public String getStoreName() {
        getClass();		// Object 내 메서드
        hashCode();		// Object 내 메서드
        return this.storeName;
    }

    // 그 외에 스토어 관련 로직
}

모든 클래스는 Object 클래스를 상속받고 있습니다. 상속받고 있는 Object 내의 메서드를 사용할 수 있습니다.

 

implements

public class StoreClass extends Object implements Runnable {
    private String storeName;       // 변수
    private String address;         // 변수

    /**
     * 메서드
     * @return
     */
    public String getStoreName() {
        getClass();
        hashCode();
        return this.storeName;
    }

    @Override		// Runnable에서 선언된 메서드
    public void run() {
        
    }

    // 그 외에 스토어 관련 로직
}
@FunctionalInterface
public interface Runnable {
    /**
     * When an object implementing interface <code>Runnable</code> is used
     * to create a thread, starting the thread causes the object's
     * <code>run</code> method to be called in that separately executing
     * thread.
     * <p>
     * The general contract of the method <code>run</code> is that it may
     * take any action whatsoever.
     *
     * @see     java.lang.Thread#run()
     */
    public abstract void run();
}

Runnable을 Implements하면 Runnable에서 구현된 메서드를 반드시 Override하여 메서드의 로직을 구현해야합니다.

 

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

먼저 코드를 보시겠습니다.

public class StoreClass {
    private String storeName;      

    public StoreClass() {
        EmployeeClass employeeClass = new EmployeeClass();  // heap 메모리 할당
    }
}

이미 정의된 클래스를 new 클래스명()으로 객체를 생성할 수 있습니다. new 를 생성하여 객체를 만드는 순간 heap 메모리 영역에 할당되고 할당된 주소값을 반환받아서 사용합니다.

 

메소드 정의하는 방법

{접근제어자} {반환타입} {메소드명} ({파라미터s}) {
    {구현}
}

public String getEmployeeName() {
    return employeeName;
}
  • 접근제어자 : 위에서 설명한 4가지로 세팅이 가능합니다. 
  • 반환타입 : 메소드에서 반환할 타입을 설정합니다.
  • 메소드명 : 메소드명을 설정하고 메소드명으로 호출할 수 있습니다.
  • 파라미터 : 메소드에 필요한 파라미터를 선언합니다.
  • 구현 : 메소드의 로직을 구현합니다.

생성자 정의하는 방법

모든 클래스는 default로 파라미터가 없는 생성자가 생성됩니다. 아래 코드 참조해주세요.

public class EmployeeClass {

    public EmployeeClass() {
        
    }
}

생성자 정의 조건

  • 반환타입이 존재하면 안됩니다.
  • 클래스 명과 동일한 메소드명이어야 합니다.
public class EmployeeClass {
    private String employeeName;        // 변수

    public EmployeeClass() {
        
    }
    
    public EmployeeClass(String employeeName) {
        // super();   숨겨져 있음
        
    }
}

생성자는 오버로딩하여 여러개 선언할 수 있습니다.

클래스를 new 하여 생성하면 내부에 선언된 변수들은 초기화되지 않습니다. 이러한 변수들을 객체 생성과 동시에 초기화하기 위한 한가지 방법입니다. 

단, 위 코드와 같이 생성자를 생성할 경우 파라미터 있는 생성자만 사용할 수 있습니다. 

 

this 키워드 이해하기

this는 자기 자신을 의미합니다. 같은 클래스에서 다른 생성자를 호출할 때 사용됩니다.

public class EmployeeClass {
    private String employeeName;        // 변수

    public EmployeeClass() {
        this("임직원 명");
    }

    public EmployeeClass(String employeeName) {
        this.employeeName = employeeName;
    }
}

위 코드는 this로 생성자에서 생성자를 호출하는 코드입니다.

반응형