유난스런 개발 기록

[JAVA] Day-3 _ 메소드(method)와 생성자(constructor) 본문

개념정리/JAVA

[JAVA] Day-3 _ 메소드(method)와 생성자(constructor)

yourhwan 2023. 1. 7. 20:26

day-3

메소드(method)와 생성자(constructor)


메소드란?

  • 메소드는 함수라고 이해하면 편리하다, 변수가 명사의 기능을 한다고 하면 메소드는 동사의 기능을 한다.
  • 메소드는 리턴 타입, 메소드 이름, 매개변수 세 가지 요소로 구성된다.
  • 메소드 이름은 변수 이름 규칙과 동일한 규칙을 적용할 수 있으며, 기능을 유추할 수 있도록 지어야 한다.
  • 메소드의 리턴 타입에 맞춰 반드시 리턴 타입으로 선언한 데이터를 리턴해야 한다.
  • 하지만 형변환을 이용하면 에러를 잡을 수 있다.
  • 매개변수를 통해 외부로 부터 필요한 데이터를 받아 온다.
  • 매개변수는 지역 변수에 해당하기 때문에 메소드가 호출될 때 메모리에 올라가고, 메소드가 종료되면 바로 삭제된다.

생성자란?

  • 생성자는 인스턴스화(객체화)할 때 사용되어지는 일종의 메소드이다.
  • 메소드 이름은 클래스 이름과 동일하다.
  • 리턴 타입이 없다면 void도 허용하지 않는다.
  • 객체 생성 시 자동으로 호출 된다.
  • 파라미터가 없는 생성자를 기본 생성자라고 한다.
  • 모든 클래스는 아래의 코드와 같이 기본 생성자를 명기하지 않으면 기본 생성자가 없는 것이 아니라 생략되어져 안보이는 것 뿐이다.
  • 생성되는 객체의 멤버 변수 초기화를 시켜준다.

this()생성자란?

  • 생성자에서 같은 클래스 내의 다른 생성자를 호출할 때 사용한다.
  • 다른 생성자 호출시 첫 줄에만 사용 가능하다.
  • 코드가 중복되지 않기 위해 사용한다.
  • 생성자를 호출하고 매개변수 값을 넣어주지 않으면 호출한 생성자의 값이 출력 된다.

파라미터가 없는 생성자를 확인해보자

//// 블로그애 패키지 명은 따로 옮기지 않겠다.
public class Member {

	// field를 생성한다.
	String userid;
	String	passwd;
	String name;
	int age;
	int point;
	
	
    // 생성자(constructor) ==> 인스턴스(객체)화 할 때 사용되어지는 일종의 메소드라고 보면 된다.
	// 아래와 같이파라미터가 없는 생성자를 기본생성자(default constructor)
	// 모든 클래스는 아래와 같이 기본생성자(default constructor)를 명기하지 않으면 
	// 기본 생성자가 없는 것이 아니라 생략되어져 안 보일 뿐이다.

	public Member() {
		System.out.println(">>> 기본생성자 Member() 가 호출됨 <<<");
		}

 

파라미터가 있는 생성자를 코드로 확인해보자

public Member(String userid, String passwd, String name) {
		// 파라미터가있는 생성자다.
        // this() 형태의 특수한 생성자가 존재한다.
        // this 는 자기자신 클래스인 Member 클래스의 인스턴스를 뜻하는 것이다.
		//지역변수명과 멤버변수명이 동일할 경우에는 지역 변수명이 더 우선한다.
    	
		this.userid = userid; // 멤버생성자를 호출
		this.passwd = passwd;
		this.name = name;
	
		System.out.println(">>> 파라미터생성자 Member(String userid, String passwd, String name) 가 호출됨 <<<");
        
        
        
        public Member(String userid, String passwd, String name, int age, int point) {
		//지역변수명과 멤버변수명이 동일할 경우에는 지역 변수명이 더 우선한다.
        //파라미터가 있는 생성자다.
	//	this.userid = userid;
	//	this.passwd = passwd;
	//	this.name = name;
	
	// 또는 다음과 같은 형태로 선언도 가능하다.
		this(userid, passwd, name);

		this.age = age;
		this.point = point;
		
		// this 는 자기자신 클래스인 Member 클래스의 인스턴스를 뜻하는 것이다.
		System.out.println(">>> 파라미터생성자 Member(String userid, String passwd, String name) 가 호출됨 <<<");
        
        void showInfo() {
		
		
		System.out.println("==="+ name + "님의 회원정보 ===\n"
						+ "1. 아이디 : "+ userid + "\n"
						+ "2. 암호 : "+ passwd + "\n"
						+ "3. 성 명 : "+ name + "\n"
						+ "4. 나 이 : "+ age + "\n"
						+ "5. 포인트 : "+ point + "\n"
						

				
				);
		
		
	}
// 블로그애 패키지 명은 따로 옮기지 않겠다.

public class MemberMain {

	public static void main(String[] args) {
		
		Member hongMbr = new Member(); // 파라미터(매개변수)가 없는 생성자를 기본생성자(default constructor)라고 한다. 
		hongMbr.userid = "hongkd";	   // 참조변수를 선언 후 홍길동의 id값을 초기화 시켜주는 과정
		hongMbr.passwd = "1234";	   // 참조변수를 선언 후 홍길동의 passwd값을 초기화 시켜주는 과정
		hongMbr.name = "홍길동";		   // 참조변수를 선언 후 홍길동의 name값을 초기화 시켜주는 과정
		hongMbr.age = 20;			   // 참조변수를 선언 후 홍길동의 age값을 초기화 시켜주는 과정
		hongMbr.point = 100;		   // 참조변수를 선언 후 홍길동의 point값을 초기화 시켜주는 과정
		
		hongMbr.showInfo();
		
		System.out.println("\n~~~~~~~~~~~~~~~~~~~~~~\n");
		
		
		Member iyouMbr = new Member("iyou", "abcd", "아이유", 29, 300); //(파라미터(매개변수)가 있는 생성자)
		iyouMbr.showInfo();
		
		
		
		System.out.println("\n========================\n");
		
		Member chaewMbr = new Member("chaew","qwer","차은우");
		chaewMbr.showInfo();
		
		
		
		
		System.out.println("\n##########################\n");
		
		// == return 타입이 void 인 메소드 호출하기 == //
		
		// hongMbr 인스턴스(객체)의 암호를 변경해주는 메소드 호출
		hongMbr.updatePasswd("qweqwr", "0070$"); // parameter, argument, 매개변수, 인
		
		// iyouMbr 인스턴스(객체)의 암호를 변경해주는 메소드 호출
		iyouMbr.updatePasswd("abcd", "asdf!");

출력하면 다음과 같이 나온다.

>>> 기본생성자 Member() 가 호출됨 <<<
===홍길동님의 회원정보 ===
1. 아이디 : hongkd
2. 암호 : 1234
3. 성 명 : 홍길동
4. 나 이 : 20
5. 포인트 : 100


~~~~~~~~~~~~~~~~~~~~~~

>>> 파라미터생성자 Member(String userid, String passwd, String name) 가 호출됨 <<<
>>> 파라미터생성자 Member(String userid, String passwd, String name) 가 호출됨 <<<
===아이유님의 회원정보 ===
1. 아이디 : iyou
2. 암호 : abcd
3. 성 명 : 아이유
4. 나 이 : 29
5. 포인트 : 300


========================

>>> 파라미터생성자 Member(String userid, String passwd, String name) 가 호출됨 <<<
===차은우님의 회원정보 ===
1. 아이디 : chaew
2. 암호 : qwer
3. 성 명 : 차은우
4. 나 이 : 0
5. 포인트 : 0

 

리턴 타입이 있는 메소드 생성하고 호출하기

// == return 타입이 있는 매소드 생성하기 == //
// if문을 통해 결제시에 각 생성자의 잔고포인트 값에 따른 결과를 출력해준다. 
	int pointPayment(int point) {
		
		int jangoPoint = 0;	// 잔고포인트를 으로 초기화
		
		if( this.point == 0 ) {
			System.out.println(" \""+ name +"\" 님의 현재 포인트가 0 이므로 포인트 결제가 불가합니다.");
			jangoPoint = this.point;
		}
		
		else if( this.point < point) {
			
			System.out.println("\"" + name + "\" 님의 현재 포인트가 "+ this.point +" 이므로 "+ point +" 포인트 결제는 불가합니다.");
			jangoPoint = this.point;
		}
		
		else {
			System.out.println("\""+ name +" \" 님 "+ point +" 포인트 결제가 완료 되었습니다.");
			jangoPoint = this.point - point;
		}
		
		return jangoPoint;

 

// == return 타입이 있는 메소드 호출하기 == //
		int jangoPoint = hongMbr.pointPayment(30);
		System.out.println("\""+ hongMbr.name + "\"님의 남은 포인트는 "+ jangoPoint +" 입니다.\n");
		// "홍길동" 님 30 포인트 결제가 완료 되었습니다.
		// "홍길동" 님의 남은 포인트는 70 입니다.
		
		jangoPoint = chaewMbr.pointPayment(20);
		System.out.println( "\""+ chaewMbr.name + "\" 님의 남은 포인트는 "+ jangoPoint +" 입니다.\n");
		// "차은우" 님의 현재 포인트가 0 이므로 포인트 결제가 불가합니다.
		// "차은우" 님의 남은 포인트는 0 입니다.
		
		jangoPoint = iyouMbr.pointPayment(5000);
		System.out.println( "\""+ iyouMbr.name + "\" 님의 남은 포인트는 "+ jangoPoint +" 입니다.\n");
		// "아이유" 님의 현재 포인트가 300 이므로 5000 포인트 결제는 불가합니다.
		// "아이유" 님의 남은 포인트는 300 입니다.

 

출력 결과는 다음과 같다.

"홍길동 " 님 30 포인트 결제가 완료 되었습니다.
"홍길동"님의 남은 포인트는 70 입니다.

 "차은우" 님의 현재 포인트가 0 이므로 포인트 결제가 불가합니다.
"차은우" 님의 남은 포인트는 0 입니다.

"아이유" 님의 현재 포인트가 300 이므로 5000 포인트 결제는 불가합니다.
"아이유" 님의 남은 포인트는 300 입니다.

 

리턴 타입이 void인 메소드 생성하고 호출하기


// == return 타입이 void 인 메소드 생성하기 == //
	// 암호를 변경하려는 기능(메소드)
	void updatePasswd(String currentPasswd, String newPasswd) {	// 메소드 생성시 void는 리턴타입이 없는 타입이다.
		
		// 현재 인스턴스의 암호인 passwd 와 입력받은 currentPasswd 값이 서로 일치하지 않으면
		if( !passwd.equals(currentPasswd) ) {
			System.out.println(">> '"+ name +"' 님 현재 사용중인 암호와 일치하지 않는 암호를 입력하셔서 암호 변경이 불가합니다.!! <<\n");
		}
		
		// 현재 인스턴스의 암호인 passwd 와 입력받은 currentPasswd 값이 서로 일치하면
		else {
			passwd =  newPasswd;
			System.out.println(">> \""+ name +"\" 님 암호가 성공적으로 변경되었습니다.!! <<\n");
			showInfo();
		}
		
		
	}
public class MemberMain {

	public static void main(String[] args) {
		
		
		// == return 타입이 void 인 메소드 호출하기 == //
		
		// hongMbr 인스턴스(객체)의 암호를 변경해주는 메소드 호출
		hongMbr.updatePasswd("qweqwr", "0070$"); // parameter, argument, 매개변수, 인
		
		// iyouMbr 인스턴스(객체)의 암호를 변경해주는 메소드 호출
		iyouMbr.updatePasswd("abcd", "asdf!");

		
	}

}

출력 결과는 다음과 같다.

>> '홍길동' 님 현재 사용중인 암호와 일치하지 않는 암호를 입력하셔서 암호 변경이 불가합니다.!! <<

>> "아이유" 님 암호가 성공적으로 변경되었습니다.!! <<

 

 

오늘은 메소드와 생성자에 대해 배웠다. 사실 개념을 이해하고 다시 코드를 보며 정리하는 것이 쉽지 않았다.

다양한 블로그의 글을 보고 온라인 강의도 들어봤지만 직접 와닿지는 않았다.

주말이 되어 코드를 하나씩 뜯어보고 실행시켜보며 개념을 정리하니 그제서야 각각의 코드들이 정확히 어떻게 쓰이는지

그리고 왜 쓰이는지가 눈에 들어온다.

하나씩 배워가고 이해하는 과정에서 재미를 느끼는 부분이 뿌듯하다.