자바의 기초문법
객체와 클래스: 클래스 선언, 생성자
netyhobby
2015. 12. 15. 00:00
객체와 클래스
클래스의 선언(declaration)
클래스 선언과 함께 객체를 생성하라는 명령문을 작성. 객체를 생성하기 위해서는 new 연산자를 사용해야 함.
값을 저장하는 변수, 동작 메소드 필요
클래스에서 객체의 생성과 사용예
class Account { // Account라는 클래스 생성. 클래스명은 대문자
String accountNo; // 계좌번호 필드변수
String ownerName; // 소유자이름 필드변수
int balance; // 잔액 필드변수
void deposite (int amount) { // 동작 메소드
}
int withdraw (int amount) { // 동작 메소드
}
Account obj = null; // 클래스의 레퍼런스 타입 변수 선언
obj = new Account(); // 인스턴스(객체) 생성. 객체를 담는 변수에 객체를 생성하는 식(new)를 넣음.
// Account obj = new Account(); // 한줄로도 표현 가능
클래스명 인스턴스(객체) = new 클래스명();
예제) 클래스 선언의 기초 예제
1) 상품 재고 클래스
package 객체와클래스;
public class GoodsStock { // 상품재고 클래스 선언
String goodsCode; // 상품코드 필드
int stockNum; // 재고수량 필드
public void addStock(int amount) { // 재고 더하는 기능의 메소드 addStock
stockNum += amount;
}
public int subtrackStock(int amount) { // 재고 빼는 기능의 메소드 subtrackStock
if (stockNum < amount)
return 0;
stockNum -= amount;
return amount;
}
}
※ 필드 : 클래스 안에 메소드와 동일한 수준으로 선언된 변수 (Field)
---------------------------------------------------
2) GoodsStock 클래스의 객체를 생성해서 사용하는 프로그램
package 객체와클래스;
public class ClassExample1 {
public static void main(String[] args) {
GoodsStock obj; // 레퍼런스 타입의 클래스 변수 선언
obj = new GoodsStock(); // 객체 생성 (인스턴스화 : 클래스를 가지고 객체를 만드는 일)
obj.goodsCode = "52135"; // 필드에 값을 대입
obj.stockNum = 200;
System.out.println("상품코드:" + obj.goodsCode); //필드 값 사용
System.out.println("재고수량:" + obj.stockNum);
}
}
----------------------
생성자(constructor)
객체가 생성되고 나서 할 일을 클래스 안에 써두고
모든 객체들이 그 로직을 이용하여 초기화 작업을 할 수 있도록 만들어 두는 것.
GoodStock obj = new GoodStock();
obj.goodsCode = "52135";
obj.sotckNum = 200;
위의 것을 obj = new GoodsStock("52135", 200); 으로 쓰기 위해 사용할 클래스에 생성자를 넣어둘 필요가 있다. GoodsStock이라는 클래스에는 다음과 같이 생성자를 만든다.
GoodsStock(String code, int num) {
goodsCode = code;
stockNum = num;
}
GoodsStock 클래스 안에 String goodsCode와 int stockNum이 있는데 생성자에서 Sting code와 int num을 선언하여 각각 대입한다. 클래스 안의 인스턴스 변수와 생성자 안의 파라미터 변수가 똑같이 code라면 경우 this.code = code 형식으로 쓴다.
this.은 해당 클래스에 선언된 인스턴스 변수를 지칭할 때 붙인다.
생성자는 클래스와 이름이 같아야 하며 리턴타입이 없어야 한다.
예제) 생성자 기초 예제
1) GoodsStock 클래스의 객체를 생성해서 사용하는 프로그램
package 객체와클래스;
public class ClassExample1 {
public static void main(String[] args) {
GoodsStock obj; // 변수 선언
obj = new GoodsStock("52135", 200); // 객체 생성과 동시에 필드 값을 대입
System.out.println("상품코드:" + obj.goodsCode); // 필드 값 사용
System.out.println("재고수량:" + obj.stockNum);
}
}
----------------------
2) 생성자를 추가한 상품 재고 클래스
package 객체와클래스;
public class GoodsStock {
String goodsCode; // 상품코드 필드
int stockNum; // 재고수량 필드
GoodsStock(String code, int num) { // 생성자
goodsCode = code; // 생성자에서 선언한 파라미터(매개변수)를 클래스의 필드변수에 대입.
stockNum = num;
}
// 생성자의 매개변수명을 필드변수와 동일한 이름으로 한 경우 this.goodsCode = goodsCode; 형식으로 쓴다.
public void addStock(int amount) { // 재고 더하는 기능의 메소드
stockNum += amount;
}
public int subtrackStock(int amount) { // 재고 빼는 기능의 메소드
if (stockNum < amount)
return 0;
stockNum -= amount;
return amount;
}
}
----------------------
※ 생성자 : 메소드와 기본 구조는 같으나 리턴 타입(void, int 등)이 없고 생성자의 이름은 반드시 클래스의 이름과 똑같아야 한다.
예제) 생성자 기초 문제
위의 예제 생성자 안에 if 문을 써서 num 파라미터 값이 0보다 작을 때 stockNum 필드에 무조건 0을 대입하도록 수정, 다음과 같은 방법으로 객체를 생성하고 그 객체의 필드값을 출력하는 프로그램을 작성하시오.
obj = new GoodsStock("12345", - 50);
2) 생성자를 수정한 상품 재고 클래스
package 객체와클래스;
public class GoodsStock {
String goodsCode; // 상품코드 필드
int stockNum; // 재고수량 필드
GoodsStock(String code, int num) { // 생성자
goodsCode = code;
if (num < 0) // 생성자 매개변수 num에 대입되는 필드값이 음수이면 필드변수 StockNum은 0
stockNum = 0;
else // 그 외에는 필드변수 StockNum에 생성자 매개변수 num 대입
stockNum = num;
}
public void addStock(int amount) { // 재고 더하는 기능의 메소드
stockNum += amount;
}
public int subtrackStock(int amount) { // 재고 빼는 기능의 메소드
if (stockNum < amount)
return 0;
stockNum -= amount;
return amount;
}
}
----------------------
예제) 2개의 생성자를 이용한 기초 예제
1) 2개의 생성자를 선언하는 가입자 정보 클래스 SubscriberInfo
package 객체와클래스;
public class SubscriberInfo {
String name, id, password;
String phoneNo, address;
SubscriberInfo(String name, String id, String password) { // 3개의 String 파라미터를 받는 생성자 선언
this.name = name;
this.id = id;
this.password = password;
}
SubscriberInfo(String name, String id, String password, String phoneNo, String address) { // 5개의 String 파라미터를 받는 생성자 선언
this(name, id, password); // 같은 클래스의 3개의 String 파라미터 받는 생성자를 호출
this.phoneNo = phoneNo;
this.address = address;
}
void changePassword(String password) {
this.password = password;
}
void setPhoneNo(String phoneNo) {
this.phoneNo = phoneNo;
}
void setAddress(String address) {
this.address = address; // 파라미터 변수와 필드 이름이 같을 때에는 필드 이름 앞에 this.을 붙여서 구분
}
}
-----------------------
2) 2개의 생성자를 가진 SubscriberInfo의 객체를 생성하는 프로그램
package 객체와클래스;
public class ConstrExample2 {
public static void main(String[] args) {
SubscriberInfo obj1, obj2;
obj1 = new SubscriberInfo("김흥부", "idpoor", "pwzebi"); // 3개의 파라미터를 받는 생성자 호출
obj2 = new SubscriberInfo("김놀부", "idrich", "pwmoney", "000-0000", "타워팰리스"); // 5개의 파라미터를 받는 생성자 호출
printSubscriberInfo(obj1); // 아래의 printSubscriberInfo 메소드에 위의 객체 변수 대입
printSubscriberInfo(obj2);
}
static void printSubscriberInfo(SubscriberInfo obj) { // SubscriberInfo 객체의 필드값 모두 출력하는 메소드
System.out.println("이름:" + obj.name);
System.out.println("아이디:" + obj.id);
System.out.println("패스워드:" + obj.password);
System.out.println("전화번호:" + obj.phoneNo);
System.out.println("주소:" + obj.address);
}
}
※ 같은 클래스 내에서 생성자, 메소드, 필드 위치는 서로 바뀌어도 상관없다.
-----------------------
예제) 디폴트 생성자
클래스에 선언된 생성자가 하나도 없는 경우 자동으로 매개변수 없는 디폴트 생성자가 추가되므로 생성자가 없더라도 문제가 없다. 단, 선언된 생성자가 하나라도 있으면 디폴트 생성자가 자동 추가되지는 않는다. 이런 경우 파라미터 없는 객체를 생성할 때 별도로 파라미터 없는 생성자도 만들어줘야만 한다.
1) 생성자에 파라미터 없이 객체를 생성하는 프로그램
package 객체와클래스;
public class ConstrExample2 {
public static void main(String[] args) {
SubscriberInfo obj;
obj = new SubscriberInfo(); // 매개변수 없이 객체 생성
printSubscriberInfo(obj);
}
static void printSubscriberInfo(SubscriberInfo obj) {
System.out.println("이름:" + obj.name);
System.out.println("아이디:" + obj.id);
System.out.println("패스워드:" + obj.password);
System.out.println("전화번호:" + obj.phoneNo);
System.out.println("주소:" + obj.address);
}
}
2) 파라미터 변수가 없는 생성자를 추가한 SubscriberInfo 클래스
package 객체와클래스;
public class SubscriberInfo {
String name, id, password;
String phoneNo, address;
SubscriberInfo() { // 매개변수 없는 생성자 (no-arg constructor)
}
SubscriberInfo(String name, String id, String password) { // 매개변수 3개인 생성자
this.name = name;
this.id = id;
this.password = password;
}
void changePassword(String password) {
this.password = password;
}
void setPhoneNo(String phoneNo) {
this.phoneNo = phoneNo;
}
void setAddress(String address) {
this.address = address;
}
}
※ subscriberInfo에 매개변수 3개인 생성자가 이미 있었기 때문에 디폴트 생성자가 생성되지 않았으므로, 매개변수(파라미터) 없이 객체를 생성하려면 매개변수 없는 생성자를 만들어줘야만 한다. 만일 매개변수 3개인 생성자가 없었다면 디폴트 생성자가 자동 생성되므로 매개변수 없는 생성자를 굳이 만들어줄 필요가 없다.
3) 생성자가 없는 SubscriberInfo 클래스
package 객체와클래스;
public class SubscriberInfo {
String name, id, password;
String phoneNo, address;
void changePassword(String password) {
this.password = password;
}
void setPhoneNo(String phoneNo) {
this.phoneNo = phoneNo;
}
void setAddress(String address) {
this.address = address;
}
}
※ subscriberInfo에 생성자가 하나도 없는 경우 디폴트 생성자가 자동 생성되므로 위의 생성자에 파라미터 없이 객체를 생성하는 프로그램에서도 에러가 나지 않는다.
----------------------------------------------------------------------------------------------------
클래스 예제 1.
티켓 한장가격/조조할인가/시간(1조조,2일반)/인원수를 설정하고 인원수에 따른 금액을 출력 하라.
public class Ticket { // Ticket 클래스 생성
int ticketPrice;
int discountAmt;
int timeNum;
int num;
void prn() {
if(timeNum == 1){
ticketPrice = ticketPrice - discountAmt;
}
System.out.println("인원수:"+num);
System.out.println("금액:"+(ticketPrice*num));
}
}
int ticketPrice;
int discountAmt;
int timeNum;
int num;
void prn() {
if(timeNum == 1){
ticketPrice = ticketPrice - discountAmt;
}
System.out.println("인원수:"+num);
System.out.println("금액:"+(ticketPrice*num));
}
}
----------------------
public class Class_Ticket {
public static void main(String[] args) { // 실행 클래스
Ticket obj = new Ticket(); // 위의 메소드 불러와서 사용
obj.ticketPrice = 10000;
obj.discountAmt = 4000;
obj.timeNum = 1;
obj.num = 3;
obj.prn();
}
}
Ticket obj = new Ticket(); // 위의 메소드 불러와서 사용
obj.ticketPrice = 10000;
obj.discountAmt = 4000;
obj.timeNum = 1;
obj.num = 3;
obj.prn();
}
}