Language/Java

클래스 (Class) 란?

min.c00 2022. 1. 5. 10:11
class Calculate {
	
    private int num1;
    private int num2;
    
    public Calculate() {
    	this(1, 1);
    }
    
    public Calculate(int num1, int num2) {
    	this.num1 = num1;
        this.num2 = num2;
    }
    
    public int plus(int num1, int num2) {
    	return num1+num2;
    }
    
    public int plus(int num1, int num2, int num3) {
    	return num1+num2+num3;
    }
    

	public static void main(String [] args) {
		Calculate c1 = new Calculate();
        Calculate c2 = new Calculate(2,3);
        
        // 1
        System.out.println(c1.num1);
        // 2
        System.out.println(c2.num1);
        // 4
        System.out.println(c1.plus(c1.num2 + c2.num2));
        
	}

}

위의 자바 코드는 OOP(Object-Oriented Programming) 즉, 객체지향형으로 작성한 자바 코드이다. 

 

이 코드에서 클래스를 비롯한 클래스 외에 알아야 할 여러 개념에 대해 간단히 정리해 보겠습니다. 

 

먼저 '객체' 라는 단어의 의미는 '대상'을 나타내는 단어입니다.

위의 예시는 '계산기'라는 대상을 객체화 시킨 것입니다. 

 

가령, 사람들은 일반적으로  눈, 코, 입 등  같은 속성들을 갖는데 공통적으로 갖는 속성들을 모아서 정의내린것을 '클래스' 라고 합니다.  

 

OOP의 핵심이자 클래스의 핵심은 '재사용 가능하도록 설계하는것' 이 매우 중요합니다. 

 

1. 클래스의 구조

 

// 클래스명
class Calculate {
	
    // 멤버 변수
    private int num1;
    private int num2;
    
    // 생성자
    public Calculate() {
    }
    
	//메서드
    public int plus(int num1, int num2) {
    	return num1+num2;
    }
}

클래스의 구조는 크게 클래스명, 멤버변수, 생성자, 메서드로 이루어져 있습니다. 

 

클래스 명은 한국어로 작성해도 컴파일상 문제는 되지 않지만 영어로 작성하는 것이 개발자들 사이에서의 암묵적인 약속이고 맨앞의글자는 대문자로 표기 합니다. 

 

멤버변수는 앞서 말한 객체의 속성들을 의미합니다. 

 

생성자란 메모리 내에 객체가 생성될때 자동적으로 단 한번 호출되어 객체의 구조를 인식하고 생성되는 객체의 멤버 변수들을 초기화 하는데 목적을 둔 것을 말합니다.

 

// Calculate 클래스에 대한 cal 객체 생성 예시
Calculate cal = new Calculte();

객체를 생성하는 방법은  'new'를 사용하는데 있습니다. 자바에서 new 는 컴파일 되는 순간 JVM내 메모리 heap 영역에 할당이 됩니다. 

 

메서드는 클래스 내에서 특정 기능을 수행하는 함수를 의미합니다. 위의 코드 plus는 2개의 파라미터 값을 입력받아 계산한 결과를 반환해 주는 예시로 볼 수 있습니다. 

 

2. 오버로딩 (Overloading)

 

오보로딩이란 하나의 클래스 내에 인수의 개수나 형이 다른 동일한 이름의 메소드를 여러개 정의하는것을 의미합니다.

 

    public int plus(int num1, int num2) {
    	return num1+num2;
    }
    
    public int plus(int num1, int num2, int num3) {
    	return num1+num2+num3;
    }

간단히 말해 메서드의 이름은 같지만 전달받는 파라미터가 다른 메서드 여러개를 사용하는것을 의미합니다. 

 

생성자도 오버로딩을 사용해 초기값 세팅을 다양하게 할 수 있습니다. 

    public Calculate() {
   	 	
    }
    
    public Calculate(int num1, int num2) {
    	this.num1 = num1;
        this.num2 = num2;
    }
    
    // 오보로딩은 생성자를 이용하여 객체를 생성시에도 적용가능함을 보여주는 예제
    Calculate cal1 = new Calculate();
    Calculate cal2 = new Calculate(1, 2);

 

3. this & this() 

 

'this' 란 특정 객체 내에서 현재 객체 자신을 의미하는 참조 변수이다. 

class Calculate {
	
    private int num1;
    private int num2;
    
    public Calculate() {
    	this(1, 1);
    }
    
    public Calculate(int num1, int num2) {
    	this.num1 = num1;
        this.num2 = num2;
    }
    
}

 

클래스내에 멤버 변수에 접근하는 방법은 '객체.멤버변수' 방식을 사용한다. 

// 클래스에 멤버변수를 사용하기
Calculate cal = new Calculate();

cal.num1 = 1;
cal.num2 = 2;

this는 여기서 Class 자기 자신 즉, Calculate를 의미하는 것이다. 

 

this() 는 그 의미가 조금 다른데 '현재 객체내의 생성자를 의미한다' 

class Calculate {
	
    private int num1;
    private int num2;
    
    public Calculate() {
    	this(1, 1);
    }
    
    public Calculate(int num1, int num2) {
    	this.num1 = num1;
        this.num2 = num2;
    }

	public static void main(String [] args) {
	Calculate c1 = new Calculate();
        Calculate c2 = new Calculate(2,3);
        
        // 1
        System.out.println(c1.num1);
        // 2
        System.out.println(c2.num1);
        // 4
        System.out.println(c1.plus(c1.num2 + c2.num2));
        
	}

}

위의 예시에서 Calculate()라는 기본 default생성자에서 this(1,1) 로 다른 생성자를 호출하는 형태를 볼수 있다. 

 

이처럼 this() 는 한 클래스 내의 특정 생성자에서 오보로딩 되어있는 다른 생성자를 호출 할 수 있는 장점이 있지만 반드시 생성자의 첫행에 정의해야하는 주의사항도 있다. 

 

정리하자면 this는 클래스내의 멤버변수를 참조할때, this()는 다른 생성자를 호출할때 사용된다.

 

반응형