오버로딩, this() 생성자, 메서드 (23.05.01~02)

·2023년 5월 1일
0

Java

목록 보기
19/35
post-thumbnail

📝 오버로딩(Overloading)


✏️ 중복 오류

자바는 기본적으로 필드명, 생성자명, 메소드명, 변수명의 중복을 허용하지 않음

  • 예시
	private String userId; // Duplicate field User.userId -> 필드명 중복 오류
	public User() {}; // Duplicate method User() in type User -> 메소드명 중복 오류
	public String getUserId() {}; // Duplicate method getUserId() in type User
	public void ex() {
		int num = 10;
		int num = 10; // Duplicate local variable num -> 변수명 중복 오류
	}

💡 오버로딩

클래스 내에 동일한 이름의 메소드(생성자도 포함)를 여러 개 작성하는 기법
→ 하나의 이름으로 여러 기능을 수행할 수 있게 하는 것

✏️ 오버로딩 성립 조건

  1. 메소드(생성자 포함)의 이름이 동일
  2. 매개변수의 개수, 타입, 순서 중 1개라도 달라야 함
  • vo 패키지 - User 클래스
public User() { 코드 생략 }

public User( String userId, String userPw ) { 코드 생략 }

public User(String userId, String userPw, String userName,
				int userAge, char userGender) { 코드 생략 }
                
// public User() {} // 기본 생성자가 이미 작성되어 있어서 중복
	
public User(String userId) {} // 매개변수 개수가 같은 생성자가 없음
						   	  // -> 오버로딩 성립
	
public User(int userAge) {} // 매개변수 개수는 같지만 타입이 다름
							// -> 오버로딩 성립
	
public User(int userAge, String userId) {}
	// 매개변수의 개수는 같지만 타입이 다름 -> 오버로딩 성립
	
public User(String userId, int userAge) {}
	// 매개변수의 개수, 타입은 같지만 순서가 다름 -> 오버로딩 성립
	
public User(String userId, String userPw, String userName) {}
	
	//public User(String userName, String userId, String userPw) {} // 에러
	// 매개변수의 개수, 타입, 순서가 모두 같아서 오버로딩 불가
	// -> 변수명은 신경 쓰지 않는다!

📝 this() 생성자

  • 같은 클래스의 다른 생성자를 호출할 때 사용함
  • 생성자 내에서 반드시 첫 번째 줄에 작성되어야 함

    -> 왜 사용하는가? 중복 코드 제거, 코드 길이 감소, 재사용성 증가
    (가독성이 어려운 경우가 생길 수 있어서 많이 사용되지 않음)
  • 예시
	public User( String userId, String userPw ) {
				// 매개변수

		System.out.println("매개변수 생성자를 이용해서 User 객체 생성");
		System.out.println(userId + " / " + userPw);
        
        this.userId =  userId;
		
		this.userPw = userPw;
	}
    
    	public User(String userId, String userPw, String userName,
				int userAge, char userGender) {
	
		// 매개변수로 전달받은 값으로 필드 초기화
//		this.userId = userId; // 현재 객체가 가지고 있는 필드 userId에
							  // 매개변수 userId 값을 대입
//		this.userPw = userPw;
		
		this(userId, userPw); // this() 생성자
        
		this.userName = userName;
		this.userAge = userAge;
		this.userGender = userGender;
		
	}
    

📝 메서드(Method)

  • 수학의 함수와 비슷하며 호출을 통해 사용, 전달 값이 없는 상태로 호출을 하거나
    어떤 값을 전달하여 호출을 하며, 함수 내에 작성된 연산 수행
  • 수행 후 반환 값 / 결과 값은 있거나 없을 수 있음

✏️ 메서드 작성 방법

	[접근제한자] [예약어] [반환형]  메소드명([매개변수])
[접근 제한자][예약어]반환형메소드명([매개변수]) { }
publicstatic기본 자료형
protectedfinal참조형(배열, 클래스)
(default)abstractvoid
privatestatic final



💡 반환(return)

메소드 수행 후 호출부로 돌아가는 것

- 반환 값 : 돌아가면서 가져갈 결과 값
- 반환 형 : 반환 값의 자료형

-> void : 돌려보낼 값(반환 값)이 없다.
-> String : String 자료형 값을 가지고 돌아간다.


✏️ 예제 - 회원 정보 관리 프로그램 만들기

  • vo 패키지 - Member 클래스
package edu.kh.oop.method.model.vo;

public class Member {
	
	// 필드
	private String memberId; // 아이디
	private String memberPw; // 비밀번호
	private String memberName; // 이름
	private int memberAge; // 나이
	
	// 기본 생성자
	public Member() { }
	
	// 매개변수 생성자 (필드 모두 초기화 용도)
	public Member(String memberId, String memberPw, String memberName, int memberAge) {
		// 오버로딩 적용(매개변수 개수 다름)
		
		// 전달 받은 값을 필드로 옮겨 담기
		this.memberId = memberId;
		this.memberPw = memberPw;
		this.memberName = memberName;
		this.memberAge = memberAge;
		
	}

	
	// 기능 (getter/setter)
	public String getMemberId() {
		return memberId;
	}
	
	public void setMemberId(String memberId) {
		this.memberId = memberId;
	}
	
	public String getMemberPw() {
		return memberPw;
	}
	
	public void setMemberPw(String memberPw) {
		this.memberPw = memberPw;
	}
	
	public String getMemberName() {
					// get + 필드명
		return memberName;
	}
	
	public void setMemberName(String memberName) {
		this.memberName = memberName;
	}
	
	public int getMemberAge() {
		return memberAge;
	}
	
	public void setMemberAge(int memberAge) {
		this.memberAge = memberAge;
	}

}
  • service 패키지 - MemberService 클래스
package edu.kh.oop.method.model.service;

import java.util.Scanner;

import edu.kh.oop.method.model.vo.Member;

public class MemberService { // 클래스
	
	// 속성(필드)
	private Scanner sc = new Scanner(System.in);
	// System.in : 자바에서 기본적으로 저장해 둔 입력 장치(키보드)
	
	private Member memberInfo = null; // 가입한 회원의 정보를 저장할 변수
	private Member loginMember = null; // 로그인한 회원의 정보를 저장할 변수
	
	// 기능 (생성자, 메소드)
	public MemberService(){}// 기본 생성자
	
	public void displayMenu() { // 메뉴 화면 출력 기능
		
		int menuNum = 0; // 메뉴 선택용 변수
		
		do { // 한 번은 무조건 반복
			
			System.out.println("===== 회원 정보 관리 프로그램 v1 =====");
			System.out.println("1. 회원 가입");
			System.out.println("2. 로그인");
			System.out.println("3. 회원 정보 조회");
			System.out.println("4. 회원 정보 수정");
			System.out.println("0. 프로그램 종료");
			
			System.out.print("메뉴 입력 >> ");
			menuNum = sc.nextInt(); // 필드에 작성된 Scanner sc 사용
			sc.nextLine(); // 입력 버퍼에 남은 개행 문자 제거
			
			switch(menuNum) {
			case 1 : System.out.println( signUp() ); break;
				// 같은 클래스 내부에 있는 필드, 메소드는 이름만 불러도 호출 가능!
				// signUp() 메소드를 호출하여 수행 후 반환 받은 값을 출력
				
			case 2 : System.out.println( login() ); break;
			case 3 : System.out.println( selectMember() ); break;
			case 4 :
				
				int result = updateMember(); // 회원 정보 수정 메소드 수행 후
											 // 반환되는 결과를 result 변수에 저장
				
				if(result == -1) {
					System.out.println("로그인 후 이용해 주세요.");
					
				} else if(result == 0) {
					System.out.println("회원 정보 수정 실패(비밀번호 불일치)");
					
				} else { // result == 1
					System.out.println("회원 정보가 수정되었습니다.");
				}
				
				break;
			case 0 : System.out.println("프로그램을 종료합니다..."); break;
			
			default : System.out.println("잘못 입력하셨습니다. 다시 입력해 주세요.");
			}
			
		} while(menuNum != 0);
		
	}
	
	// 회원 가입 기능
	public String signUp() { // This method must return a result of type String
		// (반환형)
		// 해당 메소드가 끝나고 호출한 곳으로 돌아갈 때
		// void : 반환할 값이 없다.
		// String : String 자료형 값을 가지고 돌아간다.
		
		System.out.println("\n******회원 가입 기능******");
		
		System.out.print("아이디 : ");
		String memberId = sc.next();
		
		System.out.print("비밀번호 : ");
		String memberPw = sc.next();
		
		System.out.print("비밀번호 확인 : ");
		String memberPw2 = sc.next();
		
		System.out.print("이름 : ");
		String memberName = sc.next();
		
		System.out.print("나이 : ");
		int memberAge = sc.nextInt();
		
		// 비밀번호, 비밀번호 확인이 일치하면 회원 가입
		// 일치하지 않으면 회원 가입 실패
		if(memberPw.equals(memberPw2)) { // 일치하는 경우

			// 입력 받은 정보를 이용해서 Member 객체를 생성한 후
			// 생성된 객체의 주소를 필드에 있는 memberInfo에 대입
			memberInfo = new Member(memberId, memberPw, memberName, memberAge);
			return "회원 가입 성공!!";
			// return : 호출한 곳으로 돌려 보낸다.
			
		} else { // 일치하지 않는 경우
			return "회원 가입 실패!! (비밀번호 불일치)";
		}
		
	}
	
	// 로그인 메소드(기능)
	public String login() {
		
		System.out.println("\n***** 로그인 *****");
		
		// 회원 가입을 했는지부터 확인
		// == memberInfo가 객체를 참조하고 있는지 확인
		
		if(memberInfo == null) { // 회원 가입을 먼저 안 한 경우
			// null : 아무것도 참조하고 있지 않음
			
			return "회원 가입부터 진행해 주세요.";
		}
		
		System.out.print("아이디 입력 : ");
		String memberId = sc.next();
		
		System.out.print("비밀번호 입력 : ");
		String memberPw = sc.next();
		
		// 회원 가입 정보 (memberInfo가 참조하는 Member 객체)에서
		// 저장된 아이디, 비밀번호가
		// 입력된 아이디, 비밀번호와 같으면 "로그인 성공"
		// 아니면 "아이디 또는 비밀번호가 일치하지 않습니다."
		
		// 아이디, 비밀번호가 모두 일치할 경우
		if(memberInfo.getMemberId().equals(memberId) && 
		   memberInfo.getMemberPw().equals(memberPw)) {
			// 입력받은 memberId와
			// memberInfo 필드에서 참조 중인 Member 객체의 memberId가 같은지 확인
			
			loginMember = memberInfo;
			// 참조형 	= Member 객체 주소 (얕은 복사)

			// 회원 가입 정보를 loginMember에 대입하여
			// 어떤 회원이 로그인 했는지 구분할 수 있게 함
			
			return loginMember.getMemberName() + " 님 환영합니다.";
		
		} else {
			return "아이디 또는 비밀번호가 일치하지 않습니다.";
		}
		
	}
	
	// 회원 정보 조회 기능
	public String selectMember() {
		
		System.out.println("***** 회원 정보 조회 *****");
		
		// 1) 로그인 여부 확인 -> 필드 loginMember가 참조하는 객체가 있는지 확인
		if(loginMember == null) {
			// loginMember가 참조하는 객체가 없을 경우(null)
			
			return "로그인 후 이용해 주세요.";
			// return 구문이 수행되면 해당 메소드는 즉시 종료되고
			// 호출한 곳으로 돌아감
			
		}
		
		// 2) 로그인이 되어 있는 경우
		//	  회원 정보를 출력할 문자열을 만들어서 반환(return)
		//	  (단, 비밀번호는 제외)
		
		// 이름: 유저일
		// 아이디 : user01
		// 나이 : 25

		String str = "이름 : " + loginMember.getMemberName();
		// String edu.kh.oop.method.model.vo.Member.getMemberName()
		// 반환형					메소드 코드 위치
		
		str += "\n아이디 : " + loginMember.getMemberId();
		
		str += "\n나이 : " + loginMember.getMemberAge() + "세";
		
		return str;
	}
	
	// 회원 정보 수정(update) 기능
	public int updateMember() {
		
		System.out.println("\n***** 회원 정보 수정 *****");
		
		// 1) 로그인 여부 판별
		//	  로그인이 되어 있지 않으면 -1 반환
		if(loginMember == null) {
			return -1;
		}
		
		// 2) 수정할 회원 정보 입력 받기(이름, 나이)
		System.out.print("수정할 이름 입력 : ");
		String inputName = sc.next();
		
		System.out.print("수정할 나이 입력 : ");
		int inputAge = sc.nextInt();
		sc.nextLine();
		
		// 3) 비밀번호를 입력 받아서
		//	  로그인한 회원의 비밀번호와 일치한지 확인
		System.out.print("비밀번호 입력 : ");
		String inputPw = sc.nextLine();
						// next()를 써도 괜찮음 -> 비밀번호는 띄어쓰기가 없기 때문
		
		if(inputPw.equals( loginMember.getMemberPw() ) ) {
			// 4) 비밀번호가 같을 경우
			//	  로그인한 회원의 이름, 나이 정보를 입력받은 값으로 변경 후
			//	  1 반환
			
			loginMember.setMemberName( inputName );
			// 입력받은 inputName을
			// loginMember가 참조하는 Member 객체의 필드 memberName에 대입
			loginMember.setMemberAge( inputAge );
			
			return 1;
			
		} else {
			// 5) 비밀번호가 다를 경우 0 반환
			
			return 0;
		}
	
	}
	
}
  • run 패키지 - MemberRun 클래스
package edu.kh.oop.method.run;

import edu.kh.oop.method.model.service.MemberService;

public class MemberRun {

	public   static  void main(String[] args) {
// [접근제한자] [예약어] [반환형]  메소드명([매개변수])

		MemberService service = new MemberService();
		// MemberService의 기본 생성자가 작성되어 있지 않지만
		// 문제 없이 사용 가능
		
		// 왜? 컴파일러가 코드를 번역할 때
		// 클래스 내부에 생성자가 하나도 없다면
		// 자동으로 기본 생성자를 추가해 줌
		
		// (주의) 생성자가 하나라도 있으면 자동 생성을 안 해 준다.
		// The constructor MemberService() is undefined
		
		service.displayMenu();
				// 메소드 호출
	}

}
profile
풀스택 개발자 기록집 📁

0개의 댓글