TIL/Java

TIL 2024-10-23 (숫자 야구 게임 - 3)

myoma 2024. 10. 23. 21:08

1 ) 게임 결과 저장 Display 만들기

  • Lv_3 기능 구현.
    • 처음 생각. display 클래스를 만들어서 기능 구현.
    • playNum 이라는 게임 진행 횟수 변수를 list에 저장 후.
    • list를 반복문(for)을 통해 게임 기록 보기 구현
  • 문제 발생.
    • 하나의 클래스에 리스트 저장과 게임 기록 보기를 모두 넣으니 원하는대로 구현이 안됌
    • list의 데이터들이 날아가는 현상 발생
      • list에 저장 후 main 클래스에서 새로 불러오니 데이터가 날아감.
      • 게임 횟수 변수를 따로 가져오는 방법을 몰색
    • 결국 list를 저장하는 class를 따로 만들고, list 저장한 것을 보여주는 class 따로 구현.

  • sava에는 게임 기록 횟수들을 저장하고, view는 실행 시 반복문을 실행하여 게임 기록 보기를 실행.
public class BaseballResultSave {
    static ArrayList<Integer> list = new ArrayList<>();

    public static void baseballResultSave(int input) {
         list.add(input);
    }

    public static ArrayList<Integer> getList() {
        return list;
    }
}
  • static 정적 변수를 사용하여 list 객체를 생성해도 데이터가 변하지 않게 설정.
public class BaseballResultView {

    public void baseballResultView() {

        ArrayList<Integer> list = BaseballResultSave.getList();

        System.out.println("==========================");
        System.out.println("< 게임 기록 보기 >");
        for(int i = 0; i<list.size(); i++){
            System.out.println((i + 1) +" 번째 게임 : 진행 횟수 - " + list.get(i));
        }
        System.out.println("==========================");
    }
}
  • new 로 새로운 객체를 생성하면 데이터가 날아가기 때문에 정적 변수 static을 이용해서 데이터를 그대로 불러오기.

 


2 ) 정적 메소드란?

  • 인스턴스 생성 없이 호출이 가능하다. (인스턴스 생성 후 호출도 가능하지만 지양하고 있다.)
    • 클래스가 메모리로 올라갈 때 정적 메소드를 자동으로 생성된다.
    • 그렇기에 인스턴스를 생성하지 않고 클래스만으로 메소드 호출 가능.
public class Tset {
	public static void sm() {
    	System.out.printlf("정적 메소드 입니다.");
    }
    
    public void m() {
    	System.out.println("메소드 입니다.");
    }
}


public class Main() {
	public static void main(String[] args) {
    	Test.sm(); // O
        Test.m();  // X
        
        Test test = new Test();
        test.sm(); // X
        test.m();  // O
    }
}

 

  • 유틸리티 관련 함수를 만드는데 유용하게 사용된다.

 

  • 정적 메서드를 사용하는 기준?
    • 인스턴스를 생성하지 않고 호출할 것 인가? --> 그렇다

 

  • 정적 메서드 특징?
    1. 변화를 가정하지 않는다.
    2. 메소드가 인스턴수 변수를 사용하지 않는다.
    3. 인스턴스 생성에 의존하지 않는다.
    4. 메서드가 공유되고 있다면, 정적 메서드로 호출할 수 있다.
    5. 메서드가 변화하지 않고 오버라이딩 되지 않는다.