본문 바로가기
Java

Java_생성자, 메소드 예시(oop)

by 유서담 2023. 11. 2.

생성자

 

  • 생성자는 메소드다
  • 생성자클래스의 이름과 동일한 이름을 가진 메소드다
  • 생성자 메소드는 반환타입이 없다 (void도 있으면 안된다) 

 

 public class Sample {
    int no;
    String name;

    // 생성자 메소드
    Sample() {

    }
  }

 

 

  • 객체 생성할 때 실행되는 메소드. 즉, 객체의 초기화 작업을 진행한다
  • new 생성자 메소드( )의 형태로만 사용한다
  • 참조변수.생성자메소드( )의 형태로 사용할 수 없다.

 

인스턴스 메소드와의 차이

 

  • 인스턴스 메소드는 객체 생성 후 사용가능한 메소드다.
  • 객체 생성 후, 객체의 참조값을 가지고 있는 참조변수를 이용해서 참조변수.인스턴스 메소드( )의 형태로 사용한다

 

 

기본 생성자 메소드

 

매개변수가 하나도 없는 생성자 메소드를 기본 생성자 메소드라고 한다.

기본 생성자 메소드는 다른 생성자가 하나도 없을 때 컴파일러가 자동으로 추가한다. ( 생성자 메소드가 하나라도 존재하면 자동으로 추가되지 않는다)

 

 

생성자 메소드의  수행문

 

생성자 메소드의 수행문은 객체 생성 직후에 실행된다.

생성자 메소드의 수행문으로 객체의 멤버변수를 초기화할수 있다

  • 객체의 멤버변수는 해당 데이터 타입의 기본값으로 초기화된다.
  • 생성자메소드의 수행문으로 객체의 멤버변수에 원하는 값을 저장할 수 있다.
 public class Person {
    String name;
    int age;
    double height;
    double weight;

    Person () {
      name = "홍길동";
      age = 30;
      height = 175.5;
      weight = 71.5;
    }
  }

 

 

생성자 메소드의 중복정의

 

매개변수를 가지는 생성자 메소드를 여러개 중복정의할 수 있다. ( 기본 생성자 메소드는 중복 정의 X )

매개변수를 서로 다르게 중복정의를 해야한다.

 

생성자 메소드의 중복정의를 보여주는 예시

 

// 기본생성자
public Product() {
		
}

// 이런식으로도 표현이 가능하다.
public Product(int no, String name, String maker, int price) {
		this(no, name, maker, price, 3);
		
}

// 대부분 이런식으로 작성한다
public Product(int no, String name, String maker, int price, int stock) {
	this.no = no;
	this.name = name;
	this.maker = maker;
	this.price = price;
	this.stock = stock;
	this.soldOut = false;
}

 


 

메소드를 사용한 예시 코드

 

 

package method;

public class BankAccount {

	// iv  정의하기
	String owner;			// 예금주
	String accNo;			// 계좌번호
	int password;			// 비밀번호
	long balance;			// 현재 잔액
	double interestRate;	// 이율
	
	// 생성자 정의하기
	public BankAccount(String owner, String accNo, int password, long balance, double interestRate) {
		this.owner = owner;
		this.accNo = accNo;
		this.password = password;
		this.balance = balance;
		this.interestRate = interestRate;
	}
	
	// 인스턴스 메소드 정의하기
	
	/**
	 * 계좌정보를 화면에 출력한다
	 */
	public void display() {
		System.out.println("계좌정보");
		System.out.println("예금주 : "+owner);
		System.out.println("계좌번호 : "+accNo);
		System.out.println("현재잔액 : "+balance);
		
	}
	
	/**
	 * 입금액을 전달받아서, 계좌의 잔액만큼 증가시킨다.
	 * @param amount 입금액
	 */
	public void deposit(int ammout) {
		System.out.println("입금액 : " + ammout);
		balance += ammout;
		
		System.out.println("입금 후 잔액 : "+ balance);
		System.out.println("입금이 완료되었습니다.");
	}
	
	/**
	 * 출금요구금액, 비밀번호를 전달받아서 인증이 완료되면 요구금액만큼 출금액을 반환한다
	 * @param amount 출금요구금액
	 * @param pwd 비밀번호
	 * @return 출금액, 비밀번호가 일치하지 않으면 출금액은 0이다.
	 */
	public long withdraw(int amount, int pwd) {
		// 빠른 종료, 나쁜 경우를 먼저 찾아서 제거하기
		if(password != pwd) {
			System.out.println("비밀번호가 일치하지 않습니다");
			return 0;
		}
		
		balance -= amount;
		System.out.println("출금 후 잔액은 : "+balance);
		
		return amount;
	}
	
	/**
	 * 이전 비밀번호와 새 비밀번호를 전달받아서 비밀번호를 변경합니다
	 * 이전 비밀번호와 비밀번호가 일치하고, 새 비밀번호와 이전 비밀번호가 서로 다른경우에만
	 * 비밀번호를 변경한다
	 * @param oldPwd 이전 비밀번호
	 * @param newPwd 새 비밀번호
	 */
	public void changePassword(int oldPwd, int newPwd) {
		if(oldPwd != password) {
			System.out.println("비밀번호 변경실패 : 비밀번호가 일치하지 않습니다");
			return;
		}
		
		if (oldPwd == newPwd) {
			System.out.println("비밀번호 변경실패 : 기존 비밀번호와 같은 비밀번호를 사용할 수 없습니다");
			return;
		}
		
		password = newPwd;
		System.out.println("비밀번호 변경이 완료되었습니다");
		
	}
	
	/**
	 * 비밀번호를 전달받아서, 계좌를 해지키신다. 해지가 완료되면 해지환급금을 반환한다
	 * @param pwd 비밀번호
	 * @return 해지환급금, 현재 잔액에 이율을 적용한 금액이다.
	 */
	public long terminate(int pwd) {
		if(pwd != password) {
			System.out.println("비밀번호가 일치하지 않습니다.");
			return 0;
		}
		
		System.out.println("계좌가 해지되었습니다.");
		long amount = balance + (long)(balance * interestRate);
		
		return amount;
	}
}

 

 

BankAccount 라는 클래스에 인스턴스 변수와 인스턴스 메서드를 선언하고

 

package method;

public class BankAccountApp {
	
	public static void main(String[] args) {
		
		// 계좌정보 객체를 생성하고, 조회,입금,출금,비밀번호변경,해지 기능 사용해보기
		
		// 계좌정보 객체 생성하기
		BankAccount acc1 = new BankAccount("김유성", "1234-56-789", 1234, 1000000L, 0.05);
		
		// 계좌정보 조회하기
		acc1.display();
		System.out.println();
		
		// 입금하기
		acc1.deposit(300000);
		System.out.println();
		
		// 출금하기
		long amount1 = acc1.withdraw(50000, 1234);
		System.out.println("출금액 : "+ amount1);
		System.out.println();
		
		// 비밀번호 변경하기
		acc1.changePassword(1111, 1541);
		acc1.changePassword(1234, 4271);
		System.out.println();
		
		// 해지하기
		acc1.terminate(1545);
		long amount = acc1.terminate(4271);
		System.out.println("해지금액 : "+ amount);
	}
}

 

 

만든 토대로 출력하는 클래스인 BankAccountApp 이다

 

출력결과