벌써 1달이 지난 첫번째 월요일!
지난주부터 난이도가 급격히 올라가기 시작했는데 드디어 오늘 미터기가 깨졌다
강사님도 오늘 강의는 많이 어렵다고 하셨다..
반복학습 하는수밖에 없겠지요 ㅎㅎ
public 클래스 패키지 자손클래스 전체
protect 클래스 패키지 자손클래스
default 클래스 패키지
private 클래스
Stack :
- 호출된 메서드가 쌓이는 영역
- 메서드 내 지역변수도 Stack 영역에 생성
Heap :
- 동적 메모리 영역
- 프로그램 실행 중 객체가 생성/소멸하는 영역
- new 연산자를 이용해 클래스에 정의된 내용대로 객체(Instance)를 생성
- 소멸 : Garbage Collection이
일정 시간 마다 사용되지 않는 객체를 소멸
Static
- 정적 메모리 영역
- 프로그램 실행 시 static 키워드가 붙은
필드 / 메서드를 static 영역에 생성(할당)
- 어디서든 공유 가능(단, public 일 경우)
- 클래스명.필드명 / 클래스명.메서드명() 으로 호출
byte short int long
float double char boolean
05_opp_method_Student.java
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; // -> 미작성 시 컴파일러가 자동 추가를 해준다!!
}
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;
}
// getter / setter 자동완성 : alt + shift + s -> r
// 객체의 필드 값을 문자열로 반환하는 메서드
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);
}
}
05_opp_method_StudentRun.java
package method;
// 실행용 클래스
public class StudentRun {
public static void main(String[] args) {
// StudentService 객체 생성
StudentService service = new StudentService();
service.mainMenu();
}
}
05_opp_method_StudentService.java
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회 이상 반복을 하고 싶을 때 씀 -> while 위치에 do를 놓으면됨
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:
studyHtml(std);
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;
}
/**
* 학생 이름 수정 메서드
* @param 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() -> 소문자로 변환
// sc.next()는 string임
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.print("증가 또는 감소한 Java 역량 점수 입력 : ");
int score = sc.nextInt();
// 기존 점수에 누적!!
int temp = std.getJava() + score; // 기존 점수 + 입력된 점수
// 100점(Student.MAX_VALUE) 초과시 Student.MAX_VALUE 대입
if(temp > Student.MAX_VALUE) {
temp = Student.MAX_VALUE;
}
// 0점(Student.MIN_VALUE) 초과시 Student.MIN_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);
}
}
06_object_array_StudentRun.java
package student.run;
import student.view.StudentView;
// 실행용 클래스
public class StudentRun {
public static void main(String[] args) {
// StudentView 객체 생성
StudentView view = new StudentView();
view.mainMenu();
}
}
06_object_array_StudentView.java
package student.view;
import java.util.Scanner;
import student.dto.StudentDTO;
import student.service.StudentService;
// 콘솔창에 보여지는 용도
// == 클라이언트의 입력/출력을 담당하는 클래스
public class StudentView {
// 필드
private Scanner sc = new Scanner(System.in);
private StudentService service = new StudentService();
/**
* 메인 메뉴 출력
*/
public void mainMenu() {
int input = 0; // 입력받은 메뉴 번호를 저장할 변수
do {
System.out.println("\n----- 학생 관리 프로그램 -----");
System.out.println("1. 학생 추가");
System.out.println("2. 학생 전체 조회");
System.out.println("3. 학생 1명 정보 조회(인덱스)");
System.out.println("4. 학생 이름으로 조회"); // 동명이인 X 동명이인이 없다고 가정하고 ㄱㄱ
System.out.println("5. 학생 정보 수정(인덱스)");
System.out.println("6. 학생 1명 점수 조회(점수, 합계, 평균)");
System.out.println("7. 평균 최고점, 최저점 학생");
System.out.println("0. 종료");
System.out.print("메뉴 선택 >> ");
input = sc.nextInt();
sc.nextLine(); // 입력 버퍼에 남아있는 엔터 제거
System.out.println(); // 줄바꿈
switch(input) {
case 1: addStudent(); break;
case 2: allStudent(); break;
case 3: selectIndex(); break;
case 4: selectName(); break;
case 5: break;
case 6: break;
case 7: break;
case 0: System.out.println("*** 프로그램 종료 ***"); break;
default: System.out.println("*** 메뉴 번호 잘못 입력 ***");
}
} while(input !=0);
}
/**
* 학생 추가 화면
*
* 학번, 이름, 성별을 입력받아
* Student 객체로 만들어서
* StudentService로 전달!
* -> 추가 성공시 true / 실패시 false 반환받아
* 결과 출력
*/
private void addStudent() {
System.out.println("\n----- 학생 추가 -----\n");
System.out.print("학번 : ");
String studentNumber = sc.nextLine();
System.out.print("이름 : ");
String name = sc.nextLine();
System.out.println("성별(남/여) : ");
char gender = sc.next().charAt(0);
// 학생 객체를 생성하여 입력 받은 데이터를 저장(세팅)
StudentDTO std = new StudentDTO(studentNumber, name, gender);
// studentService 객체의 addStudent() 호출 후
// 결과 반환 받기
boolean result = service.addStudent(std);
if(result) {
System.out.println(name + " 학생이 추가 되었습니다");
} else {
System.out.println("더 이상 학생을 추가할 수 없습니다");
}
}
/**
* studentService에 있는 students 객체 배열을 얻어와
* 모든 학생 정보를 출력
*/
private void allStudent() {
System.out.println("\n----- 학생 전체 조회 -----\n");
// studentService에 있는 students 객체 배열을 얻어오기
StudentDTO[] students = service.getStudents();
// 향상된 for 문
for( StudentDTO std : students ) {
// null인 경우 == 저장된 학생이 없을 때
// -> NullpointerException 방지
// (참조변수가 null을 저장하고 있는데 사용하려고 할 때)
if(std == null) return;
System.out.println(std.toString());
System.out.println("------------------------------------");
}
}
/**
* 인덱스를 입력 받아 service에 전달 하여
* 해당 인덱스의 학생 객체 하나(StudentDTO)를 반환받아 출력
*/
private void selectIndex() {
System.out.println("\n----- 학생 1명 조회(index) -----\n");
System.out.print("조회할 인덱스 입력 : ");
int index = sc.nextInt();
// service 메서드 호출 후 학생 1명 정보 반환 받기
// -> null 또는 학생 객체 주소
StudentDTO std = service.selectIndex(index);
if(std == null) {
System.out.println("*** 해당 인덱스에 학생 객체가 존재하지 않습니다 ***");
return;
}
System.out.println(index + "번째 학생 정보");
System.out.println( std.toString() );
}
/**
* 이름을 입력받아 service의 student 배열에서
* 같은 이름을 가진 학생 객체를 얻어와 출력
* -> 이름 검색
*/
private void selectName() {
System.out.println("\n----- 이름으로 조회 -----n");
System.out.println("검색할 학생 이름 : ");
String targetName = sc.nextLine();
// 입력 받은 이름(targetName)을 서비스로 전달하여
// 일치하는 이름을 가진 학생 객체(주소 값) 반환 받기
// -> null 또는 학생 객체(주소 값)
StudentDTO std = service.selectName(targetName);
if(std == null) {
System.out.println("*** 같은 이름의 학생이 존재하지 않습니다 ***");
return;
}
System.out.println(std.toString());
}
}
06_object_array_StudentService.java
package student.service;
import java.util.Random;
import student.dto.StudentDTO;
// 기능(비즈니스 로직) 제공용 클래스
public class StudentService {
// StudentDTO 객체를 참조하는
// StudentDTO 참조 변수 5개 묶음 배열 생성
// 인덱스 : 0 ~ 4
// 각 인덱스 요소 : 초기 값 null
private StudentDTO[] students = new StudentDTO[5];
/* 기본 생성자 - 생성자는 클래스명과 이름이 같아야함!!!!*/
public StudentService() {
// 학생 객체 배열(students)에 샘플 학생 3명 추가
// students[0] : (StudentDTO) 자료형 참조 변수
students[0] = new StudentDTO("24001", "짱구" , '남');
students[1] = new StudentDTO("24002", "유리" , '여');
students[2] = new StudentDTO("24003", "맹구" , '남');
// student[3] / [4] == null
// 0 ~ 100 사이 난수 발생
// 1) Math.floor(Math.random() * 101 ) == 0 ~ 100
// 2) Random random = new Random();
// random.nextInt(101); == 0 ~ 100
Random random = new Random();
for( StudentDTO std : students) { // 향상된 for 문
// 현재 접근한 요소가 참조하는 객체가 없다면
// 반복을 종료
if(std == null) break;
// random.nextInt(101) : 0 이상 101미만 정수형 난수
std.setHtml( random.nextInt(101) );
std.setCss( random.nextInt(101) );
std.setJs( random.nextInt(101) );
std.setJava( random.nextInt(101) );
}
}
/**
* 학생 객체 배열 students 중 비어있는 인덱스에
* 전달 받은 학생 객체(std) 추가
* @param std : 입력 받은 값을 저장한 학생 객체 주소
* @return true : 추가 성공 / false : 추가 실패
* - 실패 조건 : students 배열에 꽉 차있는데 추가 학생이 전달된 경우
*/
public boolean addStudent(StudentDTO std) { // 향상된 for문
// 0번 인덱스 부터
// 순서대로 비어있는(null) 요소를 찾아
// 전달 받은 std를 대입
for(int i = 0 ; i <students.length ; i++) { // 향상된 for문
if(students[i] == null) { // i 번째 요소가 비어있는 경우
students[i] = std;
return true;
}
}
// 비어있는(null)인 요소가 없을 경우 false 반환
return false;
}
/**
* students 객체 배열에 저장된 주소를 얻어가게 하는 메서드
* @return students 객체 배열에 저장된 주소
*/
public StudentDTO[] getStudents() {
return students;
}
/**
* 학생 1명 정보 조회 (index 검색)
* @param index
* @return 조회된 학생 객체 주소 || null
*/
public StudentDTO selectIndex(int index) {
// 전달 받은 index 범위가 students의 인덱스 범위 밖엔 경우
if(index < 0 || index >= students.length) {
return null;
}
return students[index];
}
/**
* 전달 받은 이름과 이름이 일치하는 학생 객체를 반환
* @param targetName
* @return null 또는 일치하는 학생 객체(주소 값)
*/
public StudentDTO selectName(String targetName) {
// 향상된 for문
for(StudentDTO std : students) {
// 저장된 학생이 없을 경우
// -> 뒤에도 없을것!! -> 그냥 여기서 검색 종료
if(std == null) return null;
// == : 기본 자료형 비교
// A.equals(B) : 참조형(객체) 비교
if(std.getName().equals(targetName) ) {
return std;
}
}
return null;
}
}
06_object_array_StudentDTO.java
package student.dto;
// DTO(Data Transfer Object) : 값 전달용 객체
// -> 객체를 이용해서 여러 값을 묶어
// 한번에 전달하는 용도
public class StudentDTO {
private String studentNumber; // 학번
private String name; // 이름
private char gender; // 성별
private int html;
private int css;
private int js;
private int java;
// 기본 생성자 X
// - 생성자가 하나도 없을 경우
// -> 컴파일러가 기본 생성자 추가
// - 생성자가 하나 이상 존재할 경우
// -> 컴파일러가 기본 생성자 추가 안함!!
// 매개 변수 생성자
// -> 컴파일러가 기본 생성자를 만들지 않기 때문에
// 필요하면 기본 생성자를 필수 작성!!!!
public StudentDTO(String studentNumber, String name, char gender) {
this.studentNumber = studentNumber;
this.name = name;
this.gender = gender;
}
public String getStudentNumber() {
return studentNumber;
}
public void setStudentNumber(String studentNumber) {
this.studentNumber = studentNumber;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
public int getHtml() {
return html;
}
public void setHtml(int html) {
this.html = html;
}
public int getCss() {
return css;
}
public void setCss(int css) {
this.css = css;
}
public int getJs() {
return js;
}
public void setJs(int js) {
this.js = js;
}
public int getJava() {
return java;
}
public void setJava(int java) {
this.java = java;
}
public String toString() {
// 학번 / 성별 / 이름
// HTML : 100 / CSS : 50 / JS : 70 / Java : 100
return String.format( "%s / %c / %s\n"
+ "HTML : %d / CSS : %d / JS : %d / Java %d",
studentNumber, gender, name,
html, css, js, java);
}
}
ps.
소수점인데 int를 쓴다던지
연산자 우선순위 and ?? or ??
if else
if(){}
if else if else
switch
반복문
break; continue;
에 대해 공부해보기!