0925 11일차
실습과제 1,2,3 피드백
패키지 vo (Value of)
class 내부 필드의 상태(변수들)은 private를 전제로 함.
setter:값을 설정하는 목적의 메소드이기때문에 매개변수만 있음 (void)
getter:값을 내보내는 목적의 메소드라 return값만있음 (타입형 리턴)
static멤버 | non-static멤버 | |
from | 클래스에 속함 | 객체에 속함 |
초기화 시점 | 클래스가 로딩될 때 초기화, 프로그램 종료까지 메모리에 유지 |
객체가 생성될 때 초기화, 객체가 삭제될때까지 메모리에 유지 |
생성 타이밍 | 클래스를 로딩할 때 생성. 클래스의 인스턴스를 사용하지 않고도 사용가능. |
클래스의 인스턴스를 생성해야 사용 |
value | 클래스마다 공유되는 값 | 객체마다 다른 값 |
용도 | 유틸리티 메서드 등을 표현. 상수값을 저장하는데 사용 |
객체의 상태를 표현, 객체간의 관계를 나타내는데 사용 |
ex) | DB연결정보, 프로그램에서 공유할 상수값 |
학생 객체 생성시, 학생의 이름,학번,성적 등의 정보 |
다시보고 개념정리
https://peonyf.tistory.com/entry/JAVA-Static%EA%B3%BC-NonStatic
[JAVA] Static과 NonStatic
Static 멤버와 Non-Static 멤버의 차이 staitc 멤버 non-static 멤버 From 클래스에 속하는 멤버 객체에 속하는 멤버 초기화 시점 클래스가 로딩될 때 초기화되며, 프로그램 종료까지 메모리에 유지 객체가
peonyf.tistory.com

class method - class변수 접근 가능 / 객체변수인 member변수 접근 불가능
왜냐하면 객체변수는 객체를 생성해야 만들어지는 변수인데
생성시기는 class 가 먼저이기때문에 객체가 만들어지지 않는 다면 객체변수 접근 불가능.
반대로
member method에서는 둘다 접근 가능. 생성시기가 class보다 이후이기 때문에.(따로 객체를 생성해야 하기때문)
1.객체 배열
-배열변수 선언
-배열객체 할당
-번지수별로 객체할당
데이터를 담는 용도의 클래스
VO:value object
DO:domain object
DTO:data transfer object
BEAN
Entity(db관점)
0925 student 관리 예제
-studentMain:실행하는 메인클래스
-studentManager:학생관리클래스(control). 학생 정보 입력과 출력 메소드 담당
-student:학생 정보 클래스(vo). 학생의 아이디,이름,성별 속성이 있음. getter/setter
package sh.java.object.array.student;
import java.util.Scanner;
/**
*<pre>
* @author user1
* 2023-09-25
* 실행클래스(main method 포함)
*
* 의존관계(Dependency)
* -studentMain의 메소드에서 지역변수로 StudentManager 클래스 사용
*
*
*/
public class StudentMain
{
public static void main(String[] args)
{
StudentManager sm = new StudentManager();
Scanner sc = new Scanner(System.in);
// sm.inputStudents();
// sm.printStudents();
String menu = "==============\n"
+ "학생 관리 프로그램\n"
+ "==============\n"
+ "1.학생 정보 입력\n"
+ "2.학생 정보 출력\n"
+ "0.종료\n"
+ "==============";
while(true)
{
System.out.println(menu);
System.out.println("번호를 입력해주세요....>");
String choice = sc.next();
switch(choice)
{
case "1": //입력
sm.inputStudents();
break;
case "2": //출력
sm.printStudents();
break;
case "0":
System.out.println("이용해 주셔서 감사합니다.");
return;
default:
System.out.println("잘못 입력 하셨습니다.");
break;
}
}
}
}
package sh.java.object.array.student;
import java.util.Scanner;
/**
* @author user1
* 2023-09-25
* 관리자 클래스
* -Student 객체를 배열로 관리한다.
* -field : Student[]
* -method : 정보 입력, 정보 출력 (person메인에서 했던 것을 분리)
*
* StudentManager가 Student클래스 객체를 사용
* Has-a 포함관계
* StudentManager has a Student.
*
*/
public class StudentManager
{
public static final int MAX_STUDENT = 10;//학생 최대수 상수로 고정
private Student[] students = new Student[MAX_STUDENT];
private int studentIndex = 0; //실제 입력값을 가리킬 인덱스변수.and 현재까지 입력된 학생수
private Scanner sc = new Scanner(System.in);
//입력
char[]s = new char[] {'첫','두','세'};
public void inputStudents()
{
System.out.println("학생 정보를 입력해주세요....(최대 학생 수는:"+MAX_STUDENT+"명입니다.)");
for(int i=0; i<MAX_STUDENT; i++)
{
System.out.println((MAX_STUDENT+1)+"번째 학생 번호를 입력해주세요.");
long id = sc.nextLong();
System.out.println((MAX_STUDENT+1)+"번째 학생 학생 이름을 입력해주세요.");
String name = sc.next();
System.out.println((MAX_STUDENT+1)+"번째 학생 성별을 입력해주세요.(M/F)");
char gender = sc.next().toUpperCase().charAt(0);
students[studentIndex++] = new Student(id,name,gender);
System.out.println("더 입력하시겠습니까?(y/n)");
char yn = sc.next().charAt(0);
if(yn!='y')
break;
}
System.out.println("입력이 완료되었습니다.");
}
//출력
public void printStudents()
{
System.out.println("===============================");
System.out.println("학생 정보를 출력합니다.");
for(int i=0; i<studentIndex; i++) //학생 입력수만큼만 반복
{
System.out.printf("아이디:%d 이름:%s 성별:%c\n",
students[i].getId(),students[i].getName(),students[i].getGender());
}
}
}
package sh.java.object.array.student;
/**
*<pre>
* @author user1
* 2023-09-25
* VO클래스
*
*/
public class Student
{
private long id;
private String name;
private char gender;
public Student()
{
}
public Student(long id, String name, char gender)
{
this.id = id;
this.name = name;
this.gender = gender;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
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;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", gender=" + gender + "]";
}
}
코드 수정 전 max_student로 학생 수 만큼 for문으로 정보 출력 시,
nullpointException이 발생할 수 있다.
while문으로 원하는 만큼 학생 정보를 입력하는데, 배열의 길이는 10이지만
입력되어 null값이 아닌 주소값이 들어간 배열은 10이하임.
가령 5번째학생까지 입력했다면 0~4까지만 값이 들어있는 거고 그 다음부턴 기본값인 null값이 들어있다는 것.
그래서 배열 길이인 10만큼 반복한다면 [5]부터는 null이라 가져올 값이 없기때문에 nullpointException 발생
max_student 보다는 현재까지 입력된 학생수를 기록할만한 cnt변수(studentIndex)를 따로 둬서 관리해두는게 편하다.