JAVA 8일차(221102)

점햠미·2022년 11월 2일
0

JATBAP'S JAVA

목록 보기
8/22
post-thumbnail

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

어차피 그 범위 내에서만 사용할 수 있게 한정되어 있어서 붙여도 의미가 없다.

2.static 변수의 다른 용어 3가지를 말해 보시오.

클래스 변수, 공유변수, 정적변수
C언어에서는 전역변수라고도 함.(이라고 들음)

3.자바의 메모리 영역을 3가지로 나누고, 해당 영역에 들어가는 정보를 말하여 보시오

1) method area
호출된 클래스(틀)의 메모리 생성, 그 안에 데이터 멤버 중 static 변수,
static함수의 정보(값이 들어 있음)

2) call stack
메인함수 안에 생성되는 객체(메모리 주소를 가리킴)와 호출되는 함수들
순차적으로 생성 되었다가 사용이 끝나면 사용이 끝나는 순서로(생성된 순서와 반대 순서) 삭제됨

3) heap
객체의 인스턴스 변수와 메소드 정보, 
static 변수를 포함하고 있는 클래스의 주소 정보 
(동일한 클래스의 객체이고, static 변수가 있다면 static 변수 정보는 공유: 같은 주소 공유)


강사님 블로그에서 훔쳐왔습니다 충성충성^^7

4.static 변수의 접근 방법은?

클래스 내부 접근
static 변수가 선언된 클래스 내에서는 이름만으로 직접 접근 가능

클래스 외부 접근
private 으로 선언되지 않으면 클래스 외부에서도 접근 가능
접근 수준 지시자가 허용하는 범위에서 접근 가능
클래스 또는 인스턴스의 이름을 통해 접근

way.num++; 과 같이 인스턴스 이름으로 접근하는 경우는 static변수에 접근하는지, 
인스턴스 변수에 접근하는지 저 문장만 보고 파악하기 어렵다.
하지만 AccessWay.num++; 처럼 클래스 이름으로 접근하면 
static변수에 접근한다는 것을 문장만 보고도 알 수 있다.
(클래스 이름은 첫 문자 대문자이기 때문에)
그래서 인스턴스 이름으로 static변수에 접근하는 것 보다는 
클래스 이름으로 접근하는 것이 더 좋은 방법이다.

수업시간 예시: 내부, 외부에서 접근
수업시간 예시: 클래스 변수의 초기화 시점과 초기화 방법(선언시 초기화가 가장 좋음)

5.클래스 변수의 활용의 예를 드시오.

공유변수기 때문에 공유가 중요하다!! 
인스턴스 별로 가지고 있을 필요가 없는 변수 → static 변수 선언이 좋다.

값의 참조가 목적인 변수
값의 공유가 목적인 변수
그리고 그 값이 외부에서도 참조하는 값이라면 public으로 선언한다.

1) Math.PI
public static final double PI = 3.14159265358979323846;
1) 값의 공유가 목적이며 
2) 이 값은 변하지 않기 때문에 인스턴스 생성 시마다 
각각 인스턴스 별로 이 값을 가지기 위한 메모리 공간을 잡을 필요가 없다. 
효율적으로 메모리 공간을 활용하기 위해서는 이런 변수들은 static 선언을 해 줄 필요가 있다.
static 붙이면 클래스에 속하는게 아님 (클래스에서 자리만 빌려 옴):
사실 C언어에서 온거라 객체지향에서는 맞지 않는 표현이긴 함

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

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

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

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

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

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

똑같은 함수 이름으로 매개 변수(파라미터)의 타입과 개수를 달리해서 함수를 만들 수 있는것
c언어는 똑같은 함수 이름을 사용하는 것 자체가 안되는데 
OOP(object oriented programming)는 같은 함수 이름을 허용(혁명적 이었음)
호출된 메소드를 찾을 때 참조하게 되는 두 가지 정보
: 메소드의 이름 / 메소드의 매개변수 정보

→ 따라서 이 둘 중 하나의 형태가 다른 메소드를 정의하는 것이 가능하다.

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

System.out.println();
이미 각각의 타입으로 오버로딩 되어서 코딩이 되어 있기 때문에 사용할 수 있는 것.
사용자가 사용하기 쉽게 encapsulation(캡슐화) 되어 있기 때문에 
이렇게 오버로딩 되어 있는 것이 더 좋다.
(예를 들면 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
인생 망함 개조빱임

0개의 댓글