BackEnd/Java

[Java]OOP 메서드(method)

Hojung7 2024. 7. 25. 17:07

 

[기능]

package method;

// class : 객체(속성, 기능)를 정의하는 문서 (=설계도)
public class Student {
	
	/* 필드( == 멤버 변수) */
	
	// 필드 1 - class변수(== static 변수)
	// -> 클래스명.변수명 형태로 호출하기 때문에 class 변수
	public static String schoolName = "KH대학교";
			
	public static final int MIN_VALUE = 0; // 스킬역량 최소값
	public static final int MAX_VALUE =100; // 스킬 역량 최대값
	
	// 필드 2 - instance 변수
	// -> new 연산자에 의해서 생성된 객체(instance)의 변수
	private String name; 					 // 이름
	private String studentNumber;   // 학번
	private char gender; 					// 성별
	private int java;							// 자바 역량 점수
	private int html;						    // html 역량 점수
	
	/* 생성자 */
	// - new 연산자에 의해 객체 생성 시 실행되는 메서드 (기능)
	
	public Student() {} // 기본 생성자
	
	// (오버로딩 적용)
	// 매개 변수 생성자
	public Student(String name, String studentNumber, char gender) {
		this.name = name;
		this.studentNumber = studentNumber;
		this.gender = gender;
	}
	/* 메서드( == 멤버 메서드)*/
	// getter / setter
	
	/* 반환형 : 메서드 호출 시 반환되는 값의 자료형*/
	public String getName() {
		return name;
	}
	
	 	/* 매개 변수 : 메서드 호출 시 전달된 값을 저장하는 변수*/
	public void setName(String name) {
		
		this.name = name;
		
		//this 참조 변수 : 생성된 객체 자체를 참조하는 변수(이 객체!)
		
		// 반환형 void : return 옆에 반환할 값이 없다
		// return; //-> 미작성 시 컴파일러가 자동 추가
		
		// getter / setter 자동 완성 : alt + shift + s -> r
	}
	
	public String getstudentNumber() {
		return studentNumber;
	}
	
	public void setStudentNumber(String studentNumber) {
		this.studentNumber = studentNumber;
	}

	public char getGender() {
		return gender;
	}

	public void setGender(char gender) {
		this.gender = gender;
	}

	public int getJava() {
		return java;
	}

	public void setJava(int java) {
		this.java = java;
	}

	public int getHtml() {
		return html;
	}

	public void setHtml(int html) {
		this.html = html;
	}

// 객체의 필드 값을 문자열로 반환하는 메서드
	public String toString() {
		
		// 240001 / 홍길동 / 남 / java : 80 / html : 70
		
		// String String.format("패턴", 값)
		// -> 패턴 형태의 문자열을 반환하는 메서드
		//(printf와 비슷한데 printf는 출력,
		// String.format()은 문자열 만들어서 반환)
		
		return String.format("%s / %s / %c / java : %d / html : %d",
				studentNumber, name, gender, java, html);
	}
}

 

[실행]

package method;

// 실행용 클래스
public class StudentRun {

		public static void main(String[] args) {
			
			// StudentService 객체 생성
			StudentService service = new StudentService();
			
			service.mainMenu();
		}
}

 

[기능 제공]

package method;

import java.util.Scanner;

// 기능 제공용 클래스
public class StudentService {
	
	// 필드
	private Scanner sc = new Scanner(System.in); // Scanner 객체 생성
	
	/* 메인 메뉴 화면 */
	public void mainMenu() {
		
		int input = 0; // 입력 받은 메뉴 번호를 저장할 변수
		
		// 생성된 학생 객체 주소를 저장할 참조 변수
		// (null : 참조하는 객체가 없다, 주소 저장 X)
		Student std = null;
		
		// do ~ while : 최소 1회 이상 반복
		do {
			
				System.out.println("\n===== 학생 1명 관리 프로그램 ====");
				
				System.out.println("1. 학생 등록");
				System.out.println("2. 학생 정보 확인");
				System.out.println("3. 학생 이름 수정");
				System.out.println("4. Java 공부하기");
				System.out.println("5. Html 공부하기");
				System.out.println("0. 프로그램 종료");
				
				
				System.out.print("메뉴 번호 입력 : ");
				input = sc.nextInt();
				sc.nextLine(); // 입력 버퍼에 남아있는 엔터 제거
				
				System.out.println(); // 줄바꿈
				
				switch(input) {
				case 1:
					std = registStudent();
					
					System.out.println(std.getName() + "학생 등록됨!!");
					break;
				
				case 2: 
				
					System.out.println("[학생 정보 확인]");
					
					// static은 클래스명을 붙여서 호출!!
					System.out.println("학교 : " + Student.schoolName);
					
					System.out.println(std.toString());
					
					break;
					
					
				case 3:
					// 학생 이름 수정 메서드 호출 시
					// std에 저장된 학생 객체 참조 주소 전달(얕은 복사)
					
					updateName(std);
					break;
					
				case 4:
					studyJava(std);
					 break;
				
				case 5: break;
				
				case 0: System.out.println("=== 프로그램을 종료합니다...==="); break;
				
				default: System.out.println("=== 알맞은 메뉴 번호를 입력해 주세요 ===");
				}
				
				
		}while(input != 0); // 메뉴 0 선택 시 반복 종료
			
	 }

 

/**
	 * 학생 등록 메서드
	 * @return 생성된 Student 객체의 주소 반환
	 */
	 
	private Student registStudent() {
			
		System.out.println("[학생 등록]");
		System.out.print("이름 : ");
		String name = sc.nextLine();
		
		System.out.print("학번 : ");
		String studentNumber = sc.nextLine();
		
		System.out.print("성별(남/여) : ");
		char gender = sc.next().charAt(0);
	
		Student student = new Student(name, studentNumber, gender);
		
		// student 변수에는
		// 생성된 Student 객체를 참조하는 주소 값 담겨있다!!!
		// -> 주소 값을 반환
		// (== 주소 값이 복사되어 호출한 곳으로 돌아감)
		return student;
	}
	
	/**
	 * 학생 이름 수정 메서드
	 * @parm std : 전달 받은 Student 객체 참조 주소
	*/
	private void updateName(Student std) {
		
		System.out.println("[학생 이름 수정]");
		System.out.println("기존 이름 : " + std.getName() );
		
		System.out.print("변경할 이름 입력 : ");
		String newName = sc.nextLine();
		
		// 이름을 홍길동 -> 김철수로 변경 하시겠습니다?(y/n)?
		System.out.printf("이름을 %s -> %s 로 변경 하시겠습니다?(y/n)? ",
									std.getName(), newName);
		
		// String.toUpperCase() -> 대문자로 변환
		// String.toLowerCase() -> 소문자로 변환
		char check = sc.next().toLowerCase().charAt(0);
		
		if(check == 'n' ) { // 'n' 이 입력된 경우
			System.out.println("=== 이름 변경 취소됨 ===");
			return;
		}
		// 'y'가 입력 되었을 때
		std.setName(newName); // 새로운 이름을 std가 참조하는 객체에 세팅
		System.out.println("=== 이름 변경 완료!! ===");
	}
	
	/**
	 * 자바 공부 수행 -> std의 자바 역량 변경
	 * 단, 수정된 자바 역량은 최대값(100), 최소값(0) 범위 초과 불가
	 * @param std
	 */
	public void studyJava(Student std) {
		System.out.println("[Java 공부하기]");
		
		int before = std.getJava();
		System.out.println("현재 Java 역량 점수 : " + std.getJava());
		
		
		System.out.println("증가 또는 감소한 Java 역량 점수 입력 : ");
		int score = sc.nextInt();		
		
		// 기존 점수에 누적 !
		int temp = std.getJava() + score; // 기존 점수 + 입력된 점수
		std.setJava(temp); // 참조하고 있는 학생 객체 Java 필드에 대입
		
		// 100점(Student.MAX_VALUE) 초과 시 Student.MAX_VALUE 대입
		if(temp > Student.MAX_VALUE) {
			temp =Student.MAX_VALUE;
			
		}
		if (temp < Student.MIN_VALUE) {
			temp = Student.MIN_VALUE;
		}
		
		std.setJava(temp); // 참조하고 있는 학생 객체 java 필드에 대입
		
		System.out.println("=== Java 역량 점수 수정 완료 ===");
		
		// 기존  변경  증감
		// 50 -> 80 (+30)
		// 50 -> 30 (-20)

		//  90 -> 100 (+30) 최대값 초과
		//  10 -> 0 (-40) 최소값 미만
		
		// 음수인 경우 score
		// 양수인 경우 +score
		String str = (score <= 0 ) ? (score + "") : ("+" + score);
		
		System.out.printf("%d -> %d (%s) \n", before, std.getJava(), str);
		
	
	}
	
	/** HTML 역량 검사
	 * 
	 * @param std
	 */
	private void studyHtml(Student std) {
		System.out.println("[Html 공부하기]");
		
		int before = std.getHtml();
		System.out.println("현재 Html 점수는 :  " + std.getHtml());
		
		System.out.print("증가 또는 감소한 Html 역량 점수 입력 : ");
		int score =sc.nextInt();
		
		int temp = std.getHtml() + score;
		
		if(temp > Student.MAX_VALUE) {
			temp = Student.MAX_VALUE;
		}
		if(temp < Student.MIN_VALUE) {
			temp = Student.MIN_VALUE;
		}
		std.setHtml(temp);
		
		System.out.println("=== Html 역량 점수 수정 완료 ===");
		
		String str = (score <= 0) ? (score + "" ) : ("+" + score) ;
		
		System.out.printf("%d -> %d (%s) \n", before, std.getHtml(), str);
		
	}
	
	
}

 

#결과

=> 메뉴 번호 입력 시 아래와 같은 결과 출력

 

1. 학생 등록

 

2. 학생 정보 확인

 

3. 학생 이름 수정

 

4. Java 공부하기

 

5. HTML 공부하기

 

'BackEnd > Java' 카테고리의 다른 글

[Java]반환형의 다형성(Polymorphism)  (0) 2024.07.30
[Java]매개 변수의 다형성 (Polymorphism)  (0) 2024.07.30
[Java]OOP Static  (0) 2024.07.23
[Java]OOP_필드(Field)  (1) 2024.07.23
[Java]OOP_클래스  (1) 2024.07.23