공부

0925 11일차

삶은고구마 2023. 9. 25. 14:25

실습과제 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.객체 배열

 

-배열변수 선언

-배열객체 할당

-번지수별로 객체할당

 

 

Person 객체 배열

 

데이터를 담는 용도의 클래스

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)를 따로 둬서 관리해두는게 편하다.