JAVA 8일차

MOZZI KIM·2022년 11월 2일
0

JAVA

목록 보기
8/21
post-thumbnail

1. 지역변수에 접근제한자를 붙이지 않는 이유는?

지역변수(Local variable)란?
특정구역({ }) 내에서 생성되어 그 구역에서만 사용,
(함수 속에 선언되어 해당 함수 속에서만 사용이 가능한 변수)

지역변수는 접근 제한자를 붙여도 어차피 범위가 그 블록 안에서만 사용할 수 있도록 작게 한정되어 있기 때문에 접근제한자를 붙여도 의미가 없다. (매개변수 포함)


2. static 변수의 다른 용어 3가지

클래스 변수 = 공유변수 = 정적변수

static 키워드를 변수 앞에 붙이면 static 변수 라고 한다.

클래스 변수, 공유 변수

static 키워드가 안 붙어 있으면 인스턴스 변수이다.
static 키워드는 함수 앞에 붙일 수 도 있다.


3. 자바의 메모리 영역을 3가지로 나누고, 해당 영역에 들어가는 정보?

1. 메소드 영역(Method Area)
프로그램 실행 중 어떤 클래스가 사용되면, JVM은 해당 클래스의 클래스 파일(*.class) 을 읽어서 분석하여 클래스에 대한 정보(클래스 데이터)를 Method Area에 저장한다. 이 때, 그 클래스의 클래스 변수 Class variable도 이 영역에 함께 생성된다.

2. 호출 스택(Call Stack 또는 Execution Stack)
호출 스택은 메서드의 작업에 필요한 메모리 공간을 제공한다. 메서드가 호출되면, 호출 스택에 호출된 메서드를 위한 메모리가 할당되며, 메서드가 작업을 수행하는 동안 지역변수(매개변수 포함)들과 연산의 중간 결과 등을 저장하는 데 사용된다. 그리고 메서드가 작업을 마치게 되면, 할당되었던 메모리 공간은 반환되어 비워진다.

- 언제나 호출 스택의 제일 위에 있는 메서드가 현재 실행 중인 메서드
- 아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드
- 반환 타입(Return Type)이 있는 메서드는 종료되면서 결과값을 자신을 호출한 메서드(Caller)에게 반환
- 대기 상태에 있던 호출한 메서드(Caller)는 넘겨받은 반환값으로 수행을 계속 진행

3. 힙(Heap)
인스턴스가 생성되는 공간. 프로그램 실행 중 생성되는 인스턴스는 모두 이 곳에 생성된다. 즉, 인스턴스 변수(Instance variable)들이 생성되는 곳이다.


4. static 변수의 접근 방법?

static 변수의 접근방법

  • 클래스 내부에서 직접접근
  • 인스턴스 생성후 접근 > 일반변수와의 구분이 어렵기 때문에 권장하지 않는다.
  • 클래스의 이름으로 접근

public class AAA {
	
	public static void main(String[] args){
		
		BBB b1=new BBB();
		b1.num++;		// 인스턴스 생성 후 접근 
		System.out.println(b1.num);
		
		BBB.num++;		// 클래스 이름으로 접근
		System.out.println(BBB.num);
	}
}

class BBB {
	
	static int num=0;
	
	BBB()
	{
		num++;			// 클래스 내부에서 직접접근
		System.out.println(num);
	}
}

5. 클래스 변수의 활용의 예.

공유변수기 때문에 공유가 중요하다!!
인스턴스 별로 가지고 있을 필요가 없는 변수 → static 변수 선언이 좋다.
값의 참조가 목적인 변수
값의 공유가 목적인 변수
그리고 그 값이 외부에서도 참조하는 값이라면 public으로 선언한다.

 Math.PI

public static final double PI = 3.14159265358979323846;

1) 값의 공유가 목적

2) 이 값은 변하지 않기 때문에 인스턴스 생성 시마다 각각 인스턴스 별로 이 값을 가지기 위한 메모리 공간을 잡을 필요가 없다.

  • 효율적으로 메모리 공간을 활용하기 위해서는 이런 변수들은 static 선언을 해 줄 필요가 있다.

3) static 붙이면 클래스에 속하는게 아님 (클래스에서 자리만 빌려 옴)


6. 스태틱 함수에 인스턴스 변수가 올수 없는 이유?

메모리 생성 시기가 다르기 때문.

static 함수는 인스턴스 생성이 없어도 클래스가 스캔 되면서 이미 method area에 메모리 방이 만들어 질 수 있다.
인스턴스 변수는 new를 통해서 객체가 만들어져야 변수에 대한 메모리 공간 할당이 가능하다.
(그래서 인스턴스 변수임)
static 함수는 객체 생성 없이 바로 사용이 가능하다는 점을 볼 때 아직 객체가 생성되지 않아 메모리 할당이 안된 변수를 사용하는 것은 불가능 하기 때문이다.
즉, static함수는 stiatc 변수를 사용 해야 한다. static변수를 컨트롤 하는 것은 static함수이다.

반면에 인스턴스 함수 는 static, 인스턴스 변수 모두 사용할 수 있는데, static변수가 메모리에 먼저 올라와 있기 때문에(메모리 생성 시기가 빠름) 호출할 수 있는 것이다.


7. 함수안에 스태틱 변수와 함수가 올수 있는 이유?

인스턴스 함수는 static, 인스턴스 변수와 함수를 모두 사용할 수 있는데, static이 메모리에 먼저 올라와 있기 때문에(메모리 생성 시기가 빠름) 당연히 둘 다 호출할 수 있다.

static은 스캔되면 바로 메모리 방을 생성하지만 인스턴스 변수나 함수는 객체가 생성되어야 메모리가 할당된다.


8. 메소드 오버로딩이란?

오버로딩(Overloading)이란?
변수 선언시 변수 명이 중복되지 않게 선언한 것처럼 메소드도 마찬가지로 서로 구별될 수 있어야 합니다.

하지만,
자바에서는 한 클래스 내에 이름이 같은 메소드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메소드를 사용할 수 있다. 이처럼 한 클래스 내에 같은 이름의 메소드를 여러 개 정의하는 것을 메소드 오버로딩(Method Overloading) 이라 부르며 간단하게는 오버로딩(Overloading)이라 부른다.


9. 메소드 오버로딩을 적용한 대표적인 함수?

System.out.println("가나다");

System.out.println(1.23);

System.out.println(1.23f);

System.out.println(123L);

System.out.println(123);

System.out.println('a');

System.out.println(1 < 100);

이미 각각의 타입으로 오버로딩 되어서 코딩이 되어 있기 때문에 사용할 수 있는 것.

사용자가 사용하기 쉽게 encapsulation(캡슐화) 되어 있기 때문에 이렇게 오버로딩 되어 있는 것이 더 좋다.

ex) printstring, printchar...이런 방법 보다 いいと思います。

어떤 데이터 타입이 와도 같은 기능을 하게될 때는 함수 오버 로딩을 적용하는 것이 좋다.


10.가위바위보 게임 짜기


import java.util.*;

class RspGame{
	private String me;
	private int com;

	public RspGame(String me) {
		this.me = me;
	}
	public void getGame() {

		com = (int)(Math.random() * 3 + 1);

		if(com == 1){
			System.out.println("컴퓨터: 가위");	
		}else if(com == 2) {
			System.out.println("컴퓨터: 바위");
		}else {
			System.out.println("컴퓨터: 보");
		}
		

		if((me.equals("가위")) && (com == 1)) {
			System.out.println("무승부!!");
		}else if((me.equals("가위"))&&(com == 2)) {
			System.out.println("졌다! ㅠㅠ");
		}else if((me.equals("가위"))&&(com == 3)) {
			System.out.println("이겼다!!!!!");
		}else if((me.equals("바위")) && (com == 1)) {
			System.out.println("이겼다!!!!!");
		}else if((me.equals("바위"))&&(com == 2)) {
			System.out.println("무승부!!");
		}else if((me.equals("바위"))&&(com == 3)) {
			System.out.println("졌다! ㅠㅠ");
		}else if((me.equals("보")) && (com == 1)) {
			System.out.println("졌다! ㅠㅠ");
		}else if((me.equals("보"))&&(com == 2)) {
			System.out.println("이겼다!!!!!");
		}else if((me.equals("보"))&&(com == 3)) {
			System.out.println("무승부!!");
		}
	}
}

public class gbb {

	public static void main(String[] args) {
		while(true) {
			System.out.println("가위, 바위, 보 중에 하나를 입력해주세요.");
			Scanner sc = new Scanner(System.in);
			String me = sc.next();

			RspGame rsp = new RspGame(me);
			rsp.getGame();

			System.out.println("계속하시겠습니까? y/n 를 눌러주세요.");
			char rp = sc.next().charAt(0);

			if(rp == 'y' || rp == 'Y') {
				continue;
			}else {
				break;
			}
		}
		System.out.println("게임을 종료합니다.");

	}

}
profile
코린이

1개의 댓글

comment-user-thumbnail
2022년 11월 2일

피드 분위기가 너무 좋아요! 장미 한 송이 두고 가요 @)------ ^^^

답글 달기