본문 바로가기
JAVA개념 시작하기

JAVA 9일차 - 클래스패스, 접근제한자, 패키지

by 가므로 2022. 12. 5.
1.set classpath 에 대하여 설명하시오.

클래스 패스의 의미

클래스패스란 말 그대로 클래스를 찾기위한 경로이다. 자바 가상머신의 클래스 탐색 경로이다.


새로운 폴더를 만들고 그 안에 클래스 파일을 옮겨 넣게 되면 그 클래스의 인스턴스를 생성하려고 할 때 경로를 찾지 못해 에러가 발생한다. 그래서 이 때 **경로를 찾을 수 있도록** claasspath를 설정 해야 한다.

 

클래스 탐색 경로 설정

 

cmd(터미널)에서 **set classpath**명령어를 통해 새로 만든 폴더에 있는 파일의 경로를 찾을 수 있도록 설정 해주면, 정상적으로 클래스 파일을 찾아 그 클래스의 인스턴스를 생성할 수 있게된다.

 

cmd(터미널)에서 set classpath 실행 방법

 

set classpath=.; 뒤에 절대경로, 혹은 상대경로를 추가하면된다.

 

C:\PackageStudy>**`set classpath=**.;`C:\PackageStudy\MyClass

 

. (점): 현재디렉토리

;(세미콜론) 줘서 100개의 경로를 추가할 수 도 있다.

 

2.절대경로와 상대경로에 대하여 설명하시오.

절대경로와 상대경로 1
절대 경로와 상대 경로의 사용 방식

절대 경로는 처음부터 시작하여 목적지까지의 절대적인 경로를 의미한다. 시작 지점부터 목표지점까지의 어느 누가 봐도 절대적으로 이곳을 가리킬 수 있는 곳이다. 특징은 최상위 /를 포함하고 있다. 상대 경로는 현재 위치를 기준으로 하여 목적지까지의 상대적인 경로를 의미한다. (일반적으로 상대 경로로 지정하는 편이다)


예시

C:\PackageStudy>set classpath=.;C:\PackageStudy\MyClass

 

- 클래스 패스를 절대 경로로 고정시키면?

**현재 디렉토리를 기준으로 지정한 ‘상대 경로’

 

C:\PackageStudy>set classpath=.;.\MyClass

 

3. . 과 .. 의 차이는?

 

위치를 표현하는 것으로 .은 현재 디렉토리이며 ..은 이전 디렉토리를 의미한다.

 


관련 명령어들

>cd . //현재 디렉토리로 이동

>cd.. //이전(한단계 상위) 디렉토리로 이동

>cd java_area //java_area로 이동

 

//cd (change directory) : 명령창의 디렉토리 변경(이동) 명령어

//위의 명령어, 옵션은 windows, linux 동일함

 

4.package의 용도는?

클래스의 용도

자바 패키지란 클래스들의 모음집 이다. 패키지를 통해서 라이브러리끼리 구분이 가능합니다. 패키지를 사용하는 이유는 클래스명의 고유성을 보장하기 위함다. 이럴 때 패키지 기능을 사용하여 클래스의 이름이 충돌하는 것을 방지할 수 있다. 기본적으로 같은 이름의 클래스 파일을 같은 폴더에 둘 수 없기 때문에 다른 패키지를 사용하면

같은 이름을 가진 클래스 파일을 사용해야 하는 경우 다른 폴더에 저장되기 때문에 별도로 관리할 수 있다. 

 


사용법

공간: 동일 이름의 클래스 파일을 같은 위치에 둘 수 없다. // Circle.java 와 Circle.java

접근방법: 인스턴스 생성 방법에서 두 클래스에 차이가 없다. // Circl circle = new Circle();

 

공간적, 접근적 충돌 해결을 위한 패키지 선언

클래스 접근 방법의 구분 - 서로 다른 패키지의 두 클래스는 인스턴스 생성 시 사용하는 이름이 다르다.

 

// com.bit.Circle... 과 com.bat.Circle...

클래스의 공간적인 구분 - 서로 다른 패키지의 두 클래스 파일은 저장되는 위치가 다르다.

// com > bit > Circle.java 와 com > bat > Circle.java

 

 

5.package 의 기본적인 명명법(이름짓는법)은?

패키치 명명 방법1
패키지 명명 방법 실무 단계1

* 명명 규칙

명칭 소문자 사용 

패키지명에 대문자는 사용하지 않는게 좋습니다.

(권고) 소스 파일들을 각각의 그룹으로 구분하기 위해 점(.) 으로 구분 

패키지 이름으로 소스가 들어가는 폴더가 자동으로 만들어 집니다.

 

6.정보은닉에 대하여 설명하시오.

정보 은닉 1
정보 은닉2
정보 은닉3
정보 은닉 중요성의 단계

 

정보은닉(information hiding)이란 다른 객체에게 자신의 정보를 숨기고 자신의 연산만을 통해 접근을 허용하는 것으로, 클래스 외부에서 특정 정보에 접근을 막는다는 의미이다. 은닉성(隱匿性)이라고도 한다

 


정답에 가까운 설명

Java는 객체지향 언어! (반대는 절차지향 언어(c언어))**

 

객체지향 언어의 특징

1) 정보은닉 information hiding 2) 상속 inheritance

3) 다형성 polymorphism (중요! 70%) 4) 캡슐화 encapsulation

(+ 추상화 abstraction)

 

정보 은닉을 하지 않고 프로그램을 만들어 사용자에게 제공했을 때, 사용자가 클래스의 데이터에 직접적으로 접근했으나(예를 들어 논리적 오류를 가진 값을 대입하는 등으로) 에러가 발생하지 않고(컴파일 오류가 발생하지 않고)프로그램이 실행되어 원래의 프로그램의 의도와 전혀 다른 결과가 도출되는 문제가 생길 수 있다. (⇒이것은 프로그램을 잘못 만든 것이긴 함.)

 

이런 문제들을 방지하기 위해서 접근 제한자를 이용해 외부에서의 직접적인 접근 권한을 제한하고 기능(메소드)을 통해 간접적으로 접근하도록 유도하는 것이다. (그래야 논리적 오류를 가진 값 등을 가지고 접근할 때 컴파일 오류로 이어지도록 만들 수 있다.)

 

정보은닉의 기본 원칙에 따라 인스턴스 변수는 public으로, 인스턴스 변수에 접근하기 위한 메소드 들은 public으로 선언하는 것이 관례이다.

 

7.접근제한자 4가지 종류에 대하여 설명하시오.

접근 제한자 설명1
접근 제한자 2
접근 제한자 구분

접근 제한자🖐 접근 제한자(Access Modifier)는 말 그대로 접근을 제한하기 위해 사용된다.

여기서 접근이란 클래스 및 인터페이스 그리고 이들이 가지고 있는 멤버의 접근을 말한다.

어떤 경우에는 클래스와 인터페이스를 다른 패키지에서 사용하지 못하도록 막을 필요가 있습니다.

 

종류별 설명

  • public 접근 제한자: 단어 뜻 그대로 외부 클래스가 자유롭게 사용할 수 있도록 합니다.
  • protected 접근 제한자: 같은 패키지 또는 자식 클래스에서 사용할 수 있도록 합니다.
  • private 접근 제한자: 단어 뜻 그대로 개인적인 것이라 외부에서 사용될 수 없도록 합니다.
  • default 접근 제한: 같은 패키지에 소속된 클래스에서만 사용할 수 있도록 합니다.

기타 참고

 

자바 면접 족보 정리(9일 차 )

클래스패스, 접근제한자, 패키지 1.set classpath 에 대하여 설명하시오. classpath 자바 가상머신의 클래스 탐색 경로 새로운 폴더를 만들고 그 안에 클래스 파일을 옮겨 넣게 되면 그 클래스의 인스턴

luckyguystory.tistory.com

 

8.class 에서 붙일수 있는 접근 제한자 2개를 설명하고, 해당 접근제한자의 사용 목적은?

접근 제한자 설명1

외부용 : public

내부용 : private

public 접근 제한자: 단어 뜻 그대로 외부 클래스가 자유롭게 사용할 수 있도록 한다.

private 접근 제한자: 단어 뜻 그대로 개인적인 것이라 외부에서 사용될 수 없도록 한다.

 

 

9.가위, 바위, 보 게임 작성하시오.
// 파일이름 : No_9
// 작성자 : 박지인
// 작성일 : 2022년 12월 13일
// 목 적 : 가위바위보

import java.util.Scanner;

public class No_9 {
	public static void main(String[] args) {
		while (true) {
			System.out.println("가위, 바위 보 중 하나를 입력하세요.");

			Scanner scanner = new Scanner(System.in);
			String myAnswer = scanner.next();

			RockScissorsPaper game = new RockScissorsPaper(myAnswer);
			game.getResult();

			System.out.println("계속하시겠습니까?(Y/N)");
			char yesOrNo = scanner.next().charAt(0);
			if (yesOrNo == 'y' || yesOrNo == 'Y') {
				continue;
			} else
				break;
		}
		System.out.println("프로그램을 종료합니다.");

	}
}

class RockScissorsPaper {
		private int com;
		private String me;

		public RockScissorsPaper(String myAnswer) {
			this.me = myAnswer;
		}

		public void getResult() {
			com = (int) (Math.random() * 3 + 1);

			if (com == 1) {
				System.out.println("가위");
			}
			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 {
				System.out.println("이겼습니다.");
			}

		}

	}

//결과
//가위, 바위, 보 중 하나를 입력하세요.
//dd
//보
//비겼습니다.
//계속하시겠습니까?(Y/N)
//y

 

[이해 안되는 것들]

1. (system.in) : 화면에서 입력을 받겠다는 의미. (입력한 값을 바이트 단위로 읽는 것)

2. next() : 공백 이전까지의 문자열을 입력받는 메서드라고 한다.

//

문자 혹은 문자열을 공백 기준으로 한 단어 또는 한 문자씩 입력을 받는다.  따라서 위의 결과와 같이 띄어쓰기를 한 이후에 입력을 한 world를 인식하지 않는다. nextLine()의 경우에는 문자 혹은 엔터를 치기 전까지의 문장 전체를 입력받는다.

3. charAT(0) : index로 주어진 값에 해당하는 문자를 리턴한다.

4. equals : 객체끼리 내용을 비교할 수 있도록 합니다.

//

equals 메소드는 비교하고자 하는 대상의 내용 자체를 비교하지만, 

== 연산자는 비교하고자 하는 대상의 주소값을 비교합니다.

5. random() : 랜덤으로 수를 배출하는 난수 클래스이다.

6. getResult() : 사용자가 지정한 결과 값의 이름이다.

 

[궁금한 것들]

1. next().charAt(0)을 한묶음으로 사용안하면 어떻게 되는가?

-> ?

2. 경우의 수를 지정할 때 왜 ' Math.random() * 3 + 1 ' 와 같은 식을 사용하는가?

-> 컴퓨터가 가위, 바위, 보 중 하나를 내야하기 때문.

 

 

10. 아래와 같이 계산기 프로그램을 작성하시오.

* 조건값

10 + 9 // 입력을 한칸씩 띄우도록 할것 

10 + 9 = 19 계속하시겠습니까? 

10 - 7 10 - 7 = 3 계속하시겠습니까?

 

// 파일이름 : No_10
// 작성자 : 박지인
// 작성일 : 2022년 12월 13일
// 목 적 : 계산기 프로그램

import java.util.Scanner;

public class No_10 {
	public static void main(String[] args) {
		int num1, num2;
		char operator;

		Scanner scanner = null;
		while (true) {
			scanner = new Scanner(System.in);

			System.out.println("계산하려는 식을 입력하세요 (예시:1 + 1)");
			num1 = scanner.nextInt();
			operator = scanner.next().charAt(0);
			num2 = scanner.nextInt();

			Calculator myCalculator = new Calculator(num1, operator, num2);
			myCalculator.operation();

			System.out.println("계속하시겠습니까?(Y/N)");
			char yesOrNo = scanner.next().charAt(0);
			if ((yesOrNo == 'y') || (yesOrNo == 'Y')) {
				continue;
			} else if ((yesOrNo == 'n') || (yesOrNo == 'N')) {
				break;
			} else {
				System.out.println("다시 입력해주세요");
				yesOrNo = scanner.next().charAt(0);
			}

		}
		System.out.println("프로그램을 종료합니다.");

	}
}

class Calculator {
	private int num1, num2, result;
	private char operator;

	public Calculator(int num1, char operator, int num2) {
		this.num1 = num1;
		this.num2 = num2;
		this.operator = operator;
	}

	public void operation() {
		if (operator == '+') {
			result = num1 + num2;
			System.out.println(num1 + " + " + num2 + "=" + result + "입니다.");
		} else if (operator == '-') {
			result = num1 - num2;
			System.out.println(num1 + " - " + num2 + "=" + result + "입니다.");

		} else if (operator == '*' || operator == 'x') {
			result = num1 * num2;
			System.out.println(num1 + " * " + num2 + "=" + result + "입니다.");

		} else if (operator == '/') {
			result = num1 / num2;
			System.out.println(num1 + " / " + num2 + "=" + result + "입니다.");

		} else if (operator == '%') {
			result = num1 % num2;
			System.out.println(num1 + " % " + num2 + "=" + result + "입니다.");

		} 
	}

}

//결과
//계산하려는 식을 입력하세요 (예시:1 + 1)
//1 + 1
//1+1=2입니다.
//계속하시겠습니까?(Y/N)

 

[이해 안되는 것들]

1. yesOrNo = scanner.next().charAt(0); : 입력 받는 애인건가?

 

 

[궁금한 것들]

1. Scanner scanner = null; 이게 왜 있는가

2. 연산자는 왜 char를 쓰는가

3. 연산자를 잘못 입력했을 때 다시 입력하라는 방법은 없을까?

4. 연산자의 공백을 없애는 방법은 없을까?