[Java 9-1] static : 객체가 아닌 클래스로 접근하기 위한 기능을 제공하기 위한 제한자

임승현·2022년 10월 16일

Java

목록 보기
29/126

🐧static : 객체가 아닌 클래스로 접근하기 위한 기능을 제공하기 위한 제한자

◎제한자(Modifier) : 기능을 제한하기 위한 키워드
→ 접근제한자(private, package, protected, public), static, final, abstract

package oop;

//학생정보(학번, 이름, 국어, 영어, 총점)를 저장하기 위한 클래스 = VO 클래스
public class Student {
	//인스턴트 필드(Instance Field) : 객체 생성시 메모리(Heap)에 만들어지는 필드
	private int num;
	private String name;
	private int kor, eng, tot;
	
	//정적 필드(Static Field) : 클래스 생성시 메모리(Static 영역)에 만들어지는 필드
	//=> 객체에 생성되기 전에 메모리에 하나만 생성되는 필드
	//=> 생성자에서 초기화 처리하지 않고 직접 초기화 설정
	//=> 모든 객체에서 정적 필드 사용 가능 - 공유값 : 메모리 절약 및 필드값 변경이 용이
	//=> 클래스 외부에서는 클래스 이름을 사용하여 접근
	private static int total;//기본값 사용시 초기값 설정 생략
	
	//생성자(Constructor) - 객체 생성시 인스턴스 필드에 원하는 초기값을 저장하기 위해 작성
	//[Ctrl]+[Space] : 기본 생성자 만드는 단축키
	public Student() {
		// TODO Auto-generated constructor stub
	}
	//[Alt]+[Shift]+[S] >> [O]
	public Student(int num, String name, int kor, int eng) {
		super();
		this.num = num;
		this.name = name;
		this.kor = kor;
		this.eng = eng;
		//총점을 계산하여 필드에 명령 작성 - 메소드 호출
		//=> 코드의 중복성을 최소화하여 프로그램의 생산성 및 유지보수의 효율성 증가
		//tot=kor+eng;
		calcTot();
	
	//인스턴스 메소드 : this 매개변수가 존재하는 메소드
	//=> 인스턴스 필드 및 정적 필드 접근 가능
	}
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getKor() {
		return kor;
	}
	public void setKor(int kor) {
		this.kor = kor;
		calcTot();
	}
	public int getEng() {
		return eng;
	}
	public void setEng(int eng) {
		this.eng = eng;
		calcTot();
	}
	public int getTot() {
		return tot;
	}
	public void setTot(int tot) {
		this.tot = tot;
	}
	/*
	//총점을 계산하는 메소드
	public void calcTot() {
		tot=kor+eng;
	}
	*/
	
	//은닉화 선언된 메소드 - 클래스 내부에서만 사용하는 메소드 - 
	private void calcTot() {
		tot=kor+eng;
	}
	
	//필드값을 출력하는 메소드
	public void display() {
		System.out.print(name+"["+num+"]님의 성적 >> ");
		System.out.println("국어 = "+kor+", 영어 = "+eng+", 총점 = "+tot);
	}
	
	//정적 메소드(Static Method) : this 매개변수가 없는 메소드
	//=> this 매개변수가 없으므로 인스턴스 필드에 접근 불가능
	//=> 정적 필드만 접근하여 사용 가능
	//=> 객체 생성 전에 클래스 이름을 사용하여 호출 가능 - 메소드 호출의 용이성
	public static int getTotal() {
		return total;
	}
	public static void setTotal(int total) {
		Student.total = total;
	}
}
package oop;

public class StudentApp {
	public static void main(String[] args) {
		/*
		Student student1=new Student(1000, "홍길동", 90, 90);
		Student student2=new Student(2000, "임꺽정", 94, 98);
		Student student3=new Student(3000, "전우치", 92, 80);
		Student student4=new Student(4000, "일지매", 76, 82);
		Student student5=new Student(5000, "장길산", 84, 86);
		
		//student1.calcTot();
		//student2.calcTot();
		//student3.calcTot();
		//student4.calcTot();
		//student5.calcTot();
		
		student1.display();
		student2.display();
		student3.display();
		student4.display();
		student5.display();
		System.out.println("========================================================");
		
		student1.setKor(100);
		//student1.calcTot();
		student1.display();
		System.out.println("========================================================");
		*/
		
		/*
		//객체를 저장할 수 있는 참조요소가 5개인 배열 생성
		Student[] students=new Student[5];
		
		//배열의 참조요소에 객체를 생성하여 저장 - 객체 배열
		students[0]=new Student(1000, "홍길동", 90, 90);
		students[1]=new Student(2000, "임꺽정", 94, 98);
		students[2]=new Student(3000, "전우치", 92, 80);
		students[3]=new Student(4000, "일지매", 76, 82);
		students[4]=new Student(5000, "장길산", 84, 86);
		
		//참조변수(요소)에 null이 저장된 상태에서 메소드를 호출할 경우 NullPointerException발생
		for(int i=0;i<students.length;i++) {
			//참조변수(요소)에 저장된 값이 null이 아닌 경우에만 메소드 호출
			//=>  NullPointerException 발생 방지
			 * 
			if(students[i]!=null) {
			students[i].display();
			}
		}
		System.out.println("========================================================");
		*/
		
		Student[] students= {new Student(1000, "홍길동", 90, 90)
				,new Student(2000, "임꺽정", 94, 98), new Student(3000, "전우치", 92, 80)
				,new Student(4000, "일지매", 76, 82), new Student(5000, "장길산", 84, 86)};
		
		//int total=0;//모든 학생들의 성적 합계를 저장하기 위한 변수
		
		
		for(Student student:students) {
			student.display();
			
			//total+=student.getTot();//학생 총점을 반환받아 총합계에 누적
			
			//정적메소드는 클래스를 이용하여 접근 
			//형식)클래스명.필드명
			//=> 정적 필드의 접근 지정자가 private인 경우 접근 불가능
			//Student.total+=student.hetTot();
			
			//정적 메소드는 클래스를 이용하여 호출
			//형식)클래스명.메소드명(값,값,...);
			Student.setTotal(Student.getTotal()+student.getTot());
		}
		System.out.println("========================================================");
		//System.out.println("총합계 = "+total);//모든 학생들의 점수 총합계를 출력
		System.out.println("총합계 = "+Student.getTotal());
		System.out.println("========================================================");
	}
}

0개의 댓글