Java

10.24.(월) Java-10: 클래스(2)

콜라든포비 2022. 10. 26. 18:23

클래스(2)

클래스를 통해 데이터를 주고받는 방법에 대해 알아봤다.

파일을 따로 생성 후 파일 너머로 주고받을 수도 있고, 한 파일 안에 아예 클래스를 생성하여 실행클래스로 넘겨주는 방법도 있었다.

데이터의 보다 더 깔끔한 분류를 위해 같은 package안에 구현클래스 파일을 따로 생성하는 것을 디폴트 방법으로 하자.

 

데이터를 전달하는 3가지 방법 중 2가지를 배웠다: . 연산자를 이용한 방법, input함수를 이용한 방법.

마지막 방법은 생성자를 이용하는 방법이다.

첫번째 방법인 . 연산자는 특수한 경우에만 쓰이지만, 함수를 이용하는 방법과 생성자를 이용하는 방법은 두루두루 널리 쓰이기 때문에 둘 다 확실하게 짚고 넘어가자. 똑같은 작동방식이지만 형태가 살짝 다르다.

// 생성자(constructor)의 기본형태
public 클래스명(자료형 변수, 자료형 변수,...){
	변수값;
}

생성자의 특징이라면 반환형이 붙지 않고, 이름은 클래스명과 동일하게 적어줘야한다는 것이다.

같은 함수의 형태를 띄지만, 특별한 함수라고 생각하면 된다.

이전 예제들의 input함수들을 생성자로 바꿔서 다시 적어보자.

package Constructor;

public class Pay {
	private String name;
	private int salary;
	
	private int tax;
	private int netSalary;
	
//	public void input(String n, int s) {
//		name=n;
//		salary=s;
//	}

//	생성자를 이용한 방법
	public Pay(String name, int salary) {
		this.name=name;
		this.salary=salary;
	}
	
	public void NetSalary() {
		tax=(int) (salary*0.045 + 0.5);
		netSalary=salary-tax;
	}
	
	public void disp() {
		System.out.println(name + "\t" + salary + "\t" + tax + "\t" + netSalary);
		System.out.println();
	}

}
package Constructor;

public class Ex03 {
	public static void main(String[] args) {
    		Pay pay=new Pay("왕눈이", 200000);	// 객체명은 클래스명 소문자로
		pay.NetSalary();
		pay.disp();
    }
}

Pay 클래스의 객체를 생성하면서 Pay의 생성자를 통해 "왕눈이" 와 20000이라는 변수값을 String name과 int salary에 전달하고, this.를 통해 Pay 클래스의 멤버변수에 할당해줬다.

 

※ static(정적) 변수와 메소드

하나의 클래스에서 객체를 생성할때마다 새로운 객체만의 변수값을 저장하는 메모리가 할당된다. 하지만 모든 객체들이 입력값에 관계없이 똑같은 값을 가진다면 메모리가 쓸데없이 자리만 차지하는 꼴이 될 것이다. 할당메모리를 줄여주기 위해서 변수에 static 속성을 부여할 수 있다.

static 변수와 메소드는 프로그램이 종료될때까지 메모리가 남아있다. 클래스안에서 선언이 되었지만 this.키워드로 접근은 불가하고 클래스명으로만 호출해야한다.

블로그 방문 횟수를 카운트하는 예시를 보자.

package blog;

public class Visit {
	public static int count = 0;    
	public int cnt = 0;

	public void newVisit() {
		++count;
		++cnt;
	}
	
	public void disp() {
		System.out.println(count);
		System.out.println(cnt);
	}
}
package blog;

public class Blog {

	public static void main(String[] args) {
		Visit visit1=new Visit();
		visit1.newVisit();
		visit1.disp();
		
		Visit visit2=new Visit();
		visit2.newVisit();
		visit2.disp();
		
		Visit visit3=new Visit();
		visit3.newVisit();
		visit3.disp();
	}

}

Visit 클래스에 정의된 일반적인 멤버변수 cnt와 static변수 count가 초기값 0으로 선언되었다.

newVisit() 함수가 실행될때마다 cnt와 count값은 1씩 더해진다.

visit1~visit3 객체가 순서대로 생성되고 각각 newVisit() 함수를 한번씩 실행시켜서 조회수를 한번씩 올려보고나니,

cnt값은 계속 1로 고정, count값은 한 객체가 명령을 다 실행하고나서도 값을 유지해서 3까지 올라간 걸 알 수 있다.

 

비슷하게 메소드앞에 static이 붙으면 정적메소드가 된다. static의 목적이 메모리효율도 있지만 공유의 목적도 적지않기 때문에, static을 공유하고싶은 메소드에 붙여서 객체생성없이 클래스를 통해 함수를 호출이 가능하게 만들준다고 생각하면 된다.