Java 14(Static, Instance Field, Static Field, Static Method, Instance Method)

Kang.__.Mingu·2024년 5월 2일
0

Java

목록 보기
16/108

Static

  • 객체가 아닌 클래스로 필드 또는 메소드에 접근하여 사용하기 위한 기능을 제공하는 키워드(제한자)
  • 클래스(내부클래스), 필드, 메소드 작성시 사용하는 제한자

인스턴스 필드(Instance Field)

  • 객체 생성시 객체에 만들어지는 필드로 객체를 사용하여 필드에 접근
  • 생성자를 사용하여 객체 생성시 필드에 초기값 저장

정적 필드(Static Field)

  • 클래스 파일(XXX.class)를 읽어 메모리(MethodArea)에 저장될 때 만들지는 필드로 클래스를 사용하여 필드에 접근
  • 객체 생성전에 클래스에 하나만 만들어지는 필드
  • 정적 필드는 직접 값을 저장하여 초기화 처리 - 생성자를 사용하여 초기화 미처리
  • 클래스로 생성된 모든 객체는 정적 필드 사용 가능 - 모든 객체가 값을 공유하여 사용

인스턴스 메소드(Instance Method)

  • this 키워드를 제공받아 사용할 수 있는 메소드로 객체를 사용하여 호출
  • this 키워드를 사용하여 인스턴스 필드 및 인스턴스 메소드 사용 가능
  • 정적 필드 및 정적 메소드 사용 가능

정적 메소드(Static Method)

  • this 키워드를 제공받지 않은 메소드로 클래스를 사용하여 호출
  • this 키워드를 사용할 수 없으므로 인스턴스 필드 및 인스턴스 메소드 사용 불가능
  • 정적 필드 및 정적 메소드만 사용 가능
  • 정적 메소드도 getter & setter로 접근 가능

Student 클래스 작성

  • 학생정보(학번, 이름, 국어, 영어, 총점)를 저장하기 위한 클래스
public class Student {
	//인스턴스 필드(Instance Field)
	private int num;
	private String name;
	private int kor, eng, tot;
	
	//정적 필드(Static Field)
	private static int total=0;
	
	public Student() {
	}

	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();
	}

	//인스턴스 메소드(Instance Method)
	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;
	}

	public int getEng() {
		return eng;
	}
	public void setEng(int eng) {
		this.eng = eng;
	}

	public int getTot() {
		return tot;
	}
	public void setTot(int tot) {
		this.tot = tot;
	}
	
	//총점을 계산하여 필드에 저장하는 메소드
	public void calcTot() {
		tot=kor+eng;
	}
	
	public void display() {
		System.out.print("["+name+"]님의 성적 >> ");
		System.out.println("국어 = "+kor+", 영어 = "+eng+", 총점 = "+tot);
	}

	//정적 메소드(Static Method)
	public static int getTotal() {
		return total;
	}
	public static void setTotal(int total) {
		Student.total = total;
	}
}

StudentApp

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, "전우치", 91, 80);
		Student student4=new Student(4000, "일지매", 76, 82);
		Student student5=new Student(5000, "장길산", 84, 86);
		
		student1.display();
		student2.display();
		student3.display();
		student4.display();
		student5.display();
		System.out.println("==============================================================");
		student1.setKor(100); // 잘못된 부분이 있으면 수정
		student1.calcTot(); // 수정하고 나서 다시 계산
		student1.display();
		System.out.println("==============================================================");
		*/
		
		/*
		//객체를 저장할 수 있는 요소가 5개 배열을 생성하여 참조변수에 저장
		// => 모든 배열 요소에는 기본값으로 [null] 저장
		Student[] students=new Student[5];
		
		students[0]=new Student(1000, "홍길동", 90, 90);
		students[1]=new Student(2000, "임꺽정", 94, 98);
		students[2]=new Student(3000, "전우치", 91, 80);
		students[3]=new Student(4000, "일지매", 76, 82);
		students[4]=new Student(5000, "장길산", 84, 86);
		
		//반복문을 사용하여 배열 요소에 저장된 모든 객체를 참조해 메소드 호출 가능 - 일괄처리
		// => 배열 요소에 [null]이 저장된 상태에서 메소드를 호출할 경우 NullPointerException 발생
		//NullPointerException : 참조변수에 [null]이 저장된 상태에서 메소드를 호출할 경우 
		//참조할 객체가 없기 때문에 발생되는 예외
		for(int i=0;i<students.length;i++) {
			//NullPointException 발생을 방지하기 위한 선택문
			if(students[i] != null) {//배열 요소값이 [null]이 아닌 경우에만 메소드 호출
				students[i].display();
			}
		}
		System.out.println("==============================================================");
		*/
		//int total=0;
		
		Student[] students={new Student(1000, "홍길동", 90, 90)
				, new Student(2000, "임꺽정", 94, 98), new Student(3000, "전우치", 91, 80)
				, new Student(4000, "일지매", 76, 82), new Student(5000, "장길산", 84, 86)};
		
		//향상된 for 구문을 사용하여 배열 요소가 참조하는 객체를 차례대로 제공받아 일괄 처리 가능
		for(Student student : students) {
			student.display();
			// 절차지향 방법
            //total+=student.getTot();
			//Student.total+=student.getTot();
            
            // 객체지향 방법
            // 정적 필드 접근은 클래스.set메소드()
			Student.setTotal(Student.getTotal()+student.getTot());
		}
		System.out.println("==============================================================");
		//모든 학생들의 성적 합계를 계산하여 출력
		//System.out.println("총합계 = "+total);
		//System.out.println("총합계 = "+Student.total);
        
        // 정적 메서드 호출: 클래스.get메서드()
		System.out.println("총합계 = "+Student.getTotal());
		System.out.println("==============================================================");
	}
}
profile
최선을 다해 꾸준히 노력하는 개발자 망고입니당 :D

0개의 댓글