자바 스터디 할래 5주차 과제 Class(클래스)

2021. 10. 31. 18:05Java

[목차]

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

먼저 클래스를 알기 전에 객체지향프로그래밍이 무엇인지 설명하겠습니다. 

  • 객체지향프로그래밍이란? 
    현실세계에서 어떤 제품을 만들 때, 부품을 먼저 개발하고 이 부품들을 하나씩 조립해서 완성된 제품을 만들듯이,  소프트웨어를 개발할 때에도 부품에 해당하는 객체들을 먼저 만들고, 이것들을 하나씩 조립해서 완성된 프로그램을 만드는 기법을 객체지향프로그래밍
    (OOP: Object Oriented Programming) 이라고 한다. 

 

1) 클래스 정의하는 방법

[클래스 작성규칙]

번호 작성규칙
1 하나 이상의 문자로 이루어져야 한다. Car, SportsCar
2 첫 번째 글자는 숫자가 올 수 없다. Car, 3CAr(x)
3 '$','_' 외의 특수 문자는 사용할 수 없다. $Car, _Car, @Car(x), #Car(x)
4 자바 키워드는 사용할 수 없다. init(x), for(x)
public class 클래스이름{

}

public class는 무조건 소문자로 작성해야한다. 클래스 이름 뒤에는 중괄호 {}를 붙여준다. 중괄호 시작은 클래스 선언의 시작을 알려주고 중괄호 끝은 클래스 선언의 끝을 알려준다. 

 

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

객체를 만드는 방법은 아래와 같다. 아주 쉽다

new 클래스();

new는 클래스로부터 객체를 생성시키는 연산자이다. new 다음에는 생성자가 온다. 생성자는 클래스()형태를 가지고 있다. 
여태까지 객체를 만들때 아무 생각없이 사용하였는데 생성자였다니...정말 나도 모르게 아무 생각없이 받아들이는 것들이 많은것 같다! 

new 연산자로 생성된 객체는 메모리 힙(heap) 영역에 생성된다. 
현실세계에서도 물건의 위치를 모르면 그 물건을 사용할 수 없듯이 객체도 똑같이 주소를 모르면 사용할 수가 없다. 그래서 new 연산자는 heap영역에 객체를 생성시키고 객체의 주소를 리턴하도록 되어있다. 

아래와 같이 사용할 수 있다.

클래스 변수;
변수 = new 클래스();

하지만 아래와 같이 한줄로 선언할 수 있다.

클래스 변수 = new 클래스();

변수는 객체의 주소값을 가지고 있다. 여기서 보면 Heap Area에 객체가 생성이 되었고, 주소값 100위치에 있다. 
그러면 Stack Area에 변수는 객체랑 연결이 되어야하는데 그 연결을 할 수있는것이 주소값에 100이 저장되면서 객체를 참조하고 있다. 

클래스의 구성 멤버

필드
필드는 객체의 고유 데이터, 부품 객체, 상태정보를 저장하는 곳이다. 
변수는 생성자와 메서드 내에서만 사용된다. 그리고 생성자와 메서드가 실행 종료되면 자동 소멸된다. 하지만 필드는 생성자와 메서드 전체에서 사용되며 객체가 소멸되지 않는 한 객체와 함께 존재한다. 

생성자
생성자는 new 연산자로 호출되는 특별한 중괄호{} 블록이다. 생성자의 역할은 객체 생성시 초기화를 담당한다. 
필드 초기화, 메서드를 호출해서 객체를 사용할 준비를 한다. 생성자는 클래스 이름으로 되어있고, 리턴타입이 없다.

메서드
메서드는 객체의ㅐ 동작에 해당하는 중괄호 {} 블록을 말한다. 중괄호 블록은 이름을 가지고 있다. 메서드를 호출하게 되면 그 안에 있는 모든 코드들이 일괄적으로 실행된다. 
메서드는 객체 간의 데이터 전달의 수단으로 사용된다. 외부로부터 매개값을 받을 수도 있고, 실행 후 어떤 값을 리턴할 수도 있다.

3) 메서드 정의하는 방법

 

리턴타입 메서드이름([매개변수선언, ...]) {
	//실행할 코드를 작성하는 곳
	
}

리턴타임 : 메서드가 리턴하는 결과 타입을 표시
매개변수 선언 : 메서드가 실행할 때 필요한 데이터를 받기 위한 변수

메서드 이름은 왠만하면 동사이름으로 짓기를 권장합니다. 왜냐하면 메서드는 행동을 하는 것을 정의하기 때문입니다. 

리턴타입이 없는 것을 가리키는 것이 void입니다. 아래와 같이 void를 사용합니다. 

void print(){

}
  • 메서드 오버로딩(Method Overloading)
    같은 이름의 method가 인자(Parameter)의 개수와 타입, 순서가 다르면 여러개의 method를 정의할 수 있다. 이것을 Method Overloading이라고 정의한다. 아래는 메서드 오버라이딩이 되는 예를 들어보았다.

    public class Test{
    	public int save(int a) {
            return 0;
        }
        
        //오버라이딩 성공
        //파라미터 타입이 다르다
        public int save(String b){
            return 0;
        }
        //오버라이딩 실패
        //접근제한자만 다르다고 해서 오버라이딩이 되지 않는다.
        private int save(int a) {
            return 0;
        }
        
        //오버라이딩 성공
        //파라미터 갯수가 다르기 때문에
        private int save(int a, String b){
            return 0;
        }
        //오버라이딩 성공
        //파라미터 순서가 다르기 때문에 
        private int save(String b, int a){
            return 0;
        }
    
        //오버라이딩 실패
        //return Type이 다르다고 해서 오버라이딩 되지 않는다.
        public String save(String a, int b) {
            return "0";
        }	
    }​

4) 생성자를 정의하는 방법 

생성자는 아래와 같이 사용한다. 

클래스 변수 = new 생성자();

위에서도 설명을 하였지만 생성자는 객체의 초기화를 담당한다. 

  • 생성자 규칙
    • 생성자의 이름은 클래스의 이름과 같아야한다. 
    • 생성자는 return 값이 없다.
    • 생성자는 오버라이딩 할 수 있다. 

아래는 생성자 오버라이딩 예제이다. 

class Test3{
    //기본생성자
    Test3(){
        
    }

    //생성자 생성 성공
    Test3(int a){

    }

    //생성자 생성 성공 : 타입이 다르다
    Test3(String c) {
        
    }

    //생성자 생성 성공 : 파라미터 개수가 다르다
    Test3(int a, int b){

    }

    //생성자 생성 성공 : 파라미터 타입이 다르다
    Test3(int a, String c){

    }
    //생성자 생성 성공 : 파라미터 순서가 다르다
    Test3(String c, int a){

    }
 }

5) this 키워드 이해하기

this 키워드 정의

클래스가 인스턴스화 되었을 때 자기 자신의 메모리 주소를 담고 있는 키워드이다.

this키워드는 자바를 사용하면서 진짜 많이 사용하는 키워드이다. 주로 클래스 생성자에 파라미터를 받을 때 클래스에 있는 멤버 변수를 초기화 할 때 사용된다. 아래와 같이 사용된다. 

public class Test3  {
    private int number;
    private String name;

    //this 키워드를 통해서 위에 있는 멤버변수에 접근할 수 있다. 
    //왜냐하면 this는 자기 자신을 나타내기 때문이다.
    Test3(int number, String name) {
        this.number = number;
        this.name = name;
    }    
}
  • this() 사용하는 방법
    this()는 생성자에서 사용할 수 있다. 자기 자신의 생성자이기 떄문에 오버라이딩도 가능하다. 아래는 생성자에서 this()를 사용하였을때 예제이다.

    public class Test3 {
        private int number;
        private String name;
        private int money;
    
        Test3(int number, String name) {
            this(number, name, 0);
        }
    
        Test3(int number, String name, int money) {
            this.number = number;
            this.name = name;
            this.money = money;
        }
    }​

위에서 보면 this(number, name, 0)을 통해서 자기 자신의 생성자를 불렀다. 이렇게 this()를 사용함으로써 중복된 코드를 제거할 수도 있고, 서로가 변동사항이 있다면 하나의 생성자만 변경한다면 다른 곳도 한번에 변경이 되는 장점이 있다. 

이번 블로그 글에서는 클래스와 생성자, 메서드에 대해서 공부하였는데, 엣날에 공부했던 것이 다시 생각도 나고 이름 같은 것들이 나에게는 너무 헷갈렸는데 이번 기회에 제대로 알게 되는 계기가 된 것 같다. 하나하나의 정의된 이름이 중요하다는 것을 깨닫게 되는 시간이 되었던것  같다. 다음 포스트는 상속에 대해서 글을 올릴건데 이 것 또한 많은 점을 배울 수 있을거 같다 ㅋㅋ 

 

참고문헌 : 이것이 자바다