[Java] 클래스
Web/Java

[Java] 클래스

목차 (클릭시 해당 목차로 이동)


     

     

     

    클래스 정의하는 방법

     

    클래스

     

    객체를 정의해 놓은 것

     

    객체의 설계도 또는 틀 이라고 이해하면 됩니다.

     

     

    *객체

    클래스에 정의된 내용대로 메모리에 생성된 것

     

     

     

    클래스 정의하는 방법

     

     

    class 클래스명 {}

     

    class의 기본 접근 제어자는 public 입니다.

     

    • 생략해주면 기본으로 public이 붙지만 되도록 직접 접근제어자를 붙여주는 것이 좋습니다.
    • 한 java파일에는 하나의 public 클래스만 존재하도록 합니다.
    • 클래스에는 public, default만 붙일 수 있습니다.
    public class Tv {}
    public class Tv{}

     

     

     

    객체는 속성과 기능, 두 종류의 구성요소로 이루어져 있습니다.

    이 구성요소를 객체의 멤버라고 합니다.

     

    속성 = 멤버변수

    기능 = 메서드

     

     

    메서드 정의하는 방법

     

    메서드

    특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것

     

     

     

    메서드 선언, 구현하는 방법

    반환타입 메서드이름 (타입 변수명, 타입 변수명, ... ){ -> 메서드의 선언부
        // 메서드 호출시 수행될 코드 -> 메서드의 구현부
    }
    
    int add (int a, int b){
        int result = a + b;
        return result; // 호출한 메서드로 결과를 반환
    }

     

     

    반환타입

    메서드의 작업수행 결과인 반환값(return value)의 타입을 적습니다.

    만약 반환값이 없는 경우 void를 적어주어야 합니다.

     

    메서드이름

    변수의 명명규칙대로 이름을 작성하면 됩니다.

    보통 메서드는 작업을 수행하므로 동사인 경우가 많습니다.

    ex) add

     

    매개변수 선언

    메서드가 작업을 수행하는데 필요한 값들(입력)을 제공받기 위한 것입니다.

    만약 값을 전혀 입력받을 필요가 없다면 괄호안에 아무 것도 적지 않습니다.

     

    메서드의 구현부

    메서드를 호출했을 때 수행될 문장들을 넣습니다.

     

    return문

    메서드의 반환타입이 'void'가 아닌 경우, 구현부 {}안에 'return 반환값;'이 반드시 포함되어 있어야 합니다.

    작업을 수행한 결과인 반환값을 호출한 메서드로 전달하는데, 이 값의 타입은 반환타입과 일치하거나 적어도 자동 형변환이 가능한 것이어야 합니다.

     

    그리고, 메서드로의 입력(매개변수)은 여러 개일 수 있어도 출력(반환값)은 최대 하나만 허용합니다.

     

     

     

     

     

    선언된 클래스에 멤버변수와 메서드를 넣어보겠습니다.

    package javastudy.ch5;
    
    public class Tv {
        // Tv의 속성(멤버변수)
        private String color;
        private boolean power;
        private int channel;
    
        // Tv의 기능(메서드)
        void power() { power = !power; } // TV를 켜거나 끄는 메서드
        int getChannel() { return channel; } // 현재 채널 반환
        void setChannel(int channel) { this.channel = channel; } //채널 수정
        void channelUp() { ++channel; } // TV의 채널을 높이는 기능을 하는 메서드
        void channelDown() { --channel; } // TV의 채널을 낮추는 기능을 하는 메서드
    }

     

     

     

    클래스안에서 멤버변수와 메서드는 접근제어자를 생략해주면 자동으로 public입니다.

     

    클래스의 캡슐화를 위해 멤버변수는 private으로 선언해주는 것이 좋습니다.

     

     

     

     

     

     

    객체 만드는 방법

     

    지금까지 알아본 것은 클래스를 만드는 법.

    즉 Tv의 설계도를 만드는 법까지 알아보았습니다.

     

    이제 이 설계도를 가지고 객체(Tv)를 만드는 법을 알아보겠습니다.

     

     

     

    인스턴스의 생성과 사용

     

    1. 클래스명과 변수명을 써주면 클래스의 주소를 받기 위한 참조 변수가 선언됩니다.
    2. new 클래스명() 을 해주면 클래스의 객체(인스턴스)를 클래스영역에 생성한 후 그 주소를 반환합니다.
    3. 클래스명 변수명 = new 클래스명() : 인스턴스의 주소를 참조변수에 저장합니다.
    클래스명 변수명;			// 클래스의 객체를 참조하기 위한 참조변수를 선언
    변수명 = new 클래스명();	// 클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장
    
    Tv t;					// Tv클래스 타입의 참조변수 t를 선언
    t = new Tv();			// Tv인스턴스를 생성한 후, 생성된 Tv인스턴스의 주소를 t에 저장

     

     

    class TvTest{
        public static void main(String[] args) {
            Tv t = new Tv(); // TV인스턴스를 생성후 그 주소를 t에 담기
            t.setChannel(7); // TV인스턴스의 channel을 7로하기
            t.channelDown(); // TV 채널 Down
            System.out.println("now channel = " + t.getChannel());
        }
    }

     

     

    여기서 main이라는 이름의 메서드는 인스턴스화 되지 않았는데 어떻게 실행될 수 있었을까요?

     

    간단하게 상기하면 static이 붙어있기 때문에 클래스 로딩시점에서 바로 인스턴스화가 되었기 때문입니다.

     

     

    2021.06.10 - [Web/Java] - [Java 스터디] 2. 자바 데이터타입, 변수 그리고 배열

     

    [Java 스터디] 2. 자바 데이터타입, 변수 그리고 배열

    목차 (클릭시 해당 목차로 이동) 백기선님 자바 스터디 2주차입니다. 쉬운 주제일 줄 알았으나, 깊게 들어가면 몰랐던 부분들이 계속 나왔습니다. 그래서 내가 잘 모르는 부분은 좀 더 깊게 들어

    ksabs.tistory.com

     

     

     

     

     

     

    생성자 정의하는 방법

     

     

    생성자란

    생성자는 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드' 입니다.

     

     

     

    생성자의 조건

    1. 생성자의 이름은 클래스의 이름과 같아야 한다.
    2. 생성자는 리턴 값이 없다.

     

     

     

    사실,

    사실, 클래스에는 항상 기본생성자가 있어야합니다.

     

    기본생성자

    클래스이름() {}

    Tv() {}

    public Tv() { }

     

    지금까지 클래스에 생성자를 정의하지 않고도 인스턴스를 생성할 수 있었던 이유는 컴파일러가 제공하는 '기본 생성자' 덕분이었습니다.

     

    컴파일 할 때, 소스파일의 클래스에 생성자가 하나도 정의되지 않은 경우 컴파일러는 자동적으로 기본 생성자를 추가하여 컴파일 합니다.

     

     

     

    반대로말하면

     

    기본 생성자가 컴파일러에 의해서 추가되는 경우는
    클래스에 정의된 생성자가 하나도 없을 때 뿐이다.

     



     

     

    만약 tv클래스에 매개변수가 있는 생성자 하나만 있을 경우 컴파일러가 기본 생성자를 자동으로 생성해주지 않기 때문에 기본 생성자를 사용하여 인스턴스를 생성할 수 없습니다.

    public class Tv {
        // Tv의 속성(멤버변수)
        private String color;
        private boolean power;
        private int channel;
    
        // Tv의 기능(메서드)
    
        public Tv(boolean power) { }
    
        void power() { power = !power; } // TV를 켜거나 끄는 메서드
        int getChannel() { return channel; } // 현재 채널 반환
        void setChannel(int channel) { this.channel = channel; } //채널 수정
        void channelUp() { ++channel; } // TV의 채널을 높이는 기능을 하는 메서드
        void channelDown() { --channel; } // TV의 채널을 낮추는 기능을 하는 메서드
    }

     

     

     

     

     

     

     

    this

    this는 자신에 대한 참조값을 갖는 인스턴스 변수입니다.

    참조변수이기 때문에 . 으로 연결되며 같은 클래스 안이기 때문에 private 변수도 접근이 가능합니다.

     

    setChannel 메서드를 보면 this.channel = channel 이라고 되어있습니다.

     

    this.channel 이라고 자신이 속한 클래스의 멤버변수 channel이라고 명시했기 때문에 변수의 이름이 같아도 해당 메서드가 오류 없이 동작할 수 있습니다.

     

    +) 추가로 자신의 참조값을 반환할 때에도 return this; 와 같이 사용이 가능합니다.

     

     

    public class Tv {
        // Tv의 속성(멤버변수)
        private String color;
        private boolean power;
        private int channel;
    
        // Tv의 기능(메서드)
    
        public Tv(boolean power) { }
    
    	...
        void setChannel(int channel) { this.channel = channel; } //채널 수정
    	...
    }

     

     

     

     

    this()

    자신이 속한 클래스에서 오버로딩된 다른 생성자를 호출할 때 this()를 사용합니다.

        public Tv() {
            this("Black");
        }
    
        public Tv(String color) {
            this.color = color;
        }

     

    'Web > Java' 카테고리의 다른 글

    [Java] 상속  (1) 2021.07.13
    [Java] Node와 BinaryTree 구현  (2) 2021.07.08
    [Java] LinkedList, Stack, Queue  (0) 2021.07.07
    [Java] GitHub API를 이용한 대시보드 만들기  (2) 2021.07.05
    [Java] JUnit5  (0) 2021.07.05