2022.07.18 월요일/자바 정리/메서드와 클래스 사용법

Jimin·2022년 7월 18일
0

비트캠프

목록 보기
3/60

메서드

- 메서드?

  • 기능 단위로 명령문들을 묶는 문법
    • 반복 실행이 쉽다 ==> 코드 재사용성이 높아진다.
    • 코드를 작은 블록으로 분리 ==> 유지 보수가 쉬워진다.
int plus(int a, int b){
	return a+b;
    }
  • 메서드를 정의하는 문법
    • int-> return type(리턴값의 데이터 타입)
    • plus-> 메서드 명, 동사구 형태로 짓는다.
    • (int a, int b)-> parameter, 메서드를 실행할 때 외부에서 받은 값을 저장하는 변수
    • {-}-> method body
    • return a+b;-> return 명령문

메서드 호출: 메서드 블록을 실행시키는 명령문

int result = plus(100, 200);
  • plus-> 실행하는 메서드 명
  • (100, 200)-> argument, parameter에 넘겨주는 값
  • int result-> method가 return한 값을 받을 변수
  • parameter 개수와 타입, 순서 == argument 개수와 타입, 순서

가변 prameter

  • 가변 파라미터를 이용할 때는 배열을 따로 선언해서 넣지 않고 바로 넘겨주는 것이 가능하다.
  • 하지만 배열 파라미터의 경우에는 따로 배열변수를 선언해야만 배열을 넘길 수 있다.
  • 하나의 메소드 당 가변 파라미터는 한 개만 선언 할 수 있다.
  • 가변 파라미터는 반드시 맨 뒤에 와야 한다.
//가변 파라미터를 이용하는 경우
void hello(String ...names){
	for(int i=0;i<names.length;i++){
    	System.out.printf(names[i]);
    }
}

public static void main(String[] args){
	// 배열을 만들어서 전달 가능
	String[] arr = {"김구", "안중근", ..., "유관순"};
    hello(arr);
    
    // 바로 전달도 가능
    hello("김구", "안중근", ..., "유관순");
}
//일반 배열 파라미터를 이용하는 경우
void hello(String[] names){
	for(int i=0;i<names.length;i++){
    	System.out.printf(names[i]);
    }
}

public static void main(String[] args){
	// 배열을 만들어서 전달 가능
	String[] arr = {"김구", "안중근", ..., "유관순"};
    hello(arr);
    
    // 바로 전달 불가능
    hello("김구", "안중근", ..., "유관순");
}

for문 이용 방법

for(String value:arr){
	System.out.println(value);
}

call-by-value와 call-by-reference

  • Method Area
    • 자바 코드를 두는 곳
    • 명령 코드가 오는 곳
    • byte code를 두는 곳
  • JVM Stack: 메소드를 호출할 때, 로컬 변수를 두는 곳
  • Heap: new 명령으로 만드는 인스턴스 변수를 두는 곳
  • local variance: Method안에 선언된 변수로, Method call하면 준비 되어 JVM Stack에 생성된다.

- swap 함수

  • 값을 넘겨줘서 swap 함수를 돌려도 값이 바뀌지 않는 경우
  • 반환값 없이 void로 하여 객체를 넘겨서 swap 하는 방법

static class MyObject{
	int a;
    int b;
}
static void swap(MyObject ref){
	int temp=ref.a;
    ref.a = ref.b;
    ref.b = temp;
}

public static void main(String[] args){
	MyObject ref = new MyObject();
    ref.a = 100;
    ref.b = 200;
    swap(ref);
}
  • 객체 자체를 넘겨주는 swap 방법
static class MyObject{
	int a;
    int b;
}
static MyObject swap(int a, int b){
	MyObject ref = new MyObject();
    ref.a = b;
    ref.b = a;
    return ref;
}

public static void main(String[] args){
	int a = 100;
    int b = 200;
    MyObject ref = swap(a, b);
    print(ref.a, ref.b);
}

Stack Overflow 오류!

  • 호출하는 메서드로컬 변수 메모리가 많을 수록 스택 메모리가 빨리 찬다.
    => (호출 횟수X, 변수 크기O)
    즉, 스택 오버플로우는 메서드 호출 횟수에 영향을 받는 것이 아니라, 메서드에서 생성하는 로컬 변수의 크기에 영향을 받는 것을 알 수 있다.

main() 메소드의 파라미터 용도

- Program argument? 프로그램을 실행할 때 JVM에 넘겨주는 값으로 밑에와 같이 argument를 넘겨준다.

  • 끝부분에 값을 넣어준다.
$ java 클래스명 값1 값2 값3
  • 아큐먼트는 공백으로 구분한다.
  • JVM은 아규먼트의 개수만큼 배열을 만들어 저장한다.
  • 아규먼트가 없으면 빈 배열을 만든다.
  • main()을 호출할 때 만든 배열의 주소를 넘겨준다.
$ java Exam 0520 aaa bbb ccc

-> main(String[] args){-}에서 String args에 aaa, bbb, ccc가 new String("aaa", "bbb", "ccc")로 들어가게 된다.

- JVM argument? JVM에게 전달하는 값

  • 형식 (-D이름=값 명령문은 파일 이름 앞에 써주어야 한다.)
$java -cp ./bin/main/ 
-D이름=값 -D이름=값 -D이름=값 
com.eomcs.basic.ex07.Exam0610
  • JVM argument의 값 꺼내기
$System.getProperty("이름");

- System.getProperties()

  • Properties 객체: JVM에 설정된 환경 변수 값들, JVM의 전체 프로퍼티 목록을 가져올 수 있다.
  • 프로퍼티 객체는 keySet()을 통해 객체에 저장되어 있는 값의 이름(key)들을 가져올 수 있다.
  • key에 들어 있는 것은 String이 맞지만, 문법 상으로 key 변수가 Object로 되어 있어서 Object로 받아서, String이라고 타입강제변형해주어 컴파일러에게 String이라고 알려주어야 한다.

Properties와 국제화, 지역화

  • 국제화(Internationalization; I18N): application에서 언어에 따라 라벨을 달리 출력할 수 있도록 프로그래밍 단계에서 고려해서 만든 경우
  • 지역화(Localization; L10N): 지역 언어에 맞춰 메뉴나 라벨의 텍스트를 설정한 것
    예) ko-KR.properties

CLASS 문법 활용 예

  • createScore()메소드
    • Score Instance 생성
    • Factory Method: 공장 역할을 수행하는 메소드
    • new 인스턴스 생성 쉬움
    • 유지보수하기가 쉽다.
  • factory method를 이용하여 board-app의 App.java 소스파일 수정해 보았다. -> BoardHandler.class에 makeBoard Method 추가하여 edit Method 수정
  • makeBoard에서 이미 파라미터를 통해 값을 받아서 객체에 받은 값을 넣어서 그 객체를 return하므로 그 값을 다시 원래 사용할 객체에 넣어줘서 사용했다. -> 훨씬 간결+유지보수 유리
// 원래 코드
static void edit(int editIdx) {
    Board board = boards[editIdx];
    String title= Prompt.inputString("제목? " + "("+board.title+")");
    String content= Prompt.inputString("내용? "+ "("+board.content+")");
    String writer = Prompt.inputString("작성자? "+ "("+board.writer+")");
    String password = Prompt.inputString("암호? "+ "("+board.password+")");
    if(isEdit()) {
      board.title =title;
      board.content =content;
      board.writer=writer;
      board.password = password;
      System.out.println("성공적으로 변경되었습니다!");
    }else {
      System.out.println("변경을 취소하였습니다.");
      return;
    }
  }
// 수정된 코드
 static void edit(int editIdx) {
    Board board = boards[editIdx];
    String title= Prompt.inputString("제목? " + "("+board.title+")");
    String content= Prompt.inputString("내용? "+ "("+board.content+")");
    String writer = Prompt.inputString("작성자? "+ "("+board.writer+")");
    String password = Prompt.inputString("암호? "+ "("+board.password+")");
    if(isEdit()) {
      board = makeBoard(title, content, writer, password);
      System.out.println("성공적으로 변경되었습니다!");
    }else {
      System.out.println("변경을 취소하였습니다.");
      return;
    }
  }
  
  static Board makeBoard(String title, String content, String writer, String pwd) {
    Board board = new Board();
    board.title =title;
    board.content =content;
    board.writer=writer;
    board.password = pwd;
    return board;
  }

-> 지금보니까 파라미터로 board를 넘겨줬어야 했는데 어떻게 작동한거지,,?

profile
https://github.com/Dingadung

0개의 댓글