자바 가상머신이 프로그램을 실행할 때. 클래스 파일을 찾는 데에 기준이 되는 파일 경로라고 할 수 있다.
즉, 자바 가상머신이 클래스 파일 찾는 경로
지정해주지 않으면 자바 가상머신은 현재 디렉토리에서 필요한 클래스들을 가져와서 쓴다.
C:\PackageStudy>set classpath=.;C:\PackageStudy\MyClass
C:\PackageStudy>set classpath=.;.\MyClass
. 현재디렉토리, .. 이전 디렉토리
>cd . //현재 디렉토리로 이동
>cd.. //이전(한단계 상위) 디렉토리로 이동
>cd java_area //java_area로 이동
//cd (change directory) : 명령창의 디렉토리 변경(이동) 명령어
//위의 명령어, 옵션은 windows, linux 동일함
자바 패키지란?
패키지를 사용하는 이유?
기본적으로 회사의 도메인을 뒤에서부터 작성(www는 제외: 전세계 공통)하고 마지막은 팀 이름 또는 프로젝트 이름을 작성한다.
구분은 점(.)으로 한다.(폴더가 생성되는 단위)
예시) com.bit.class4 , com.oracle.팀 이름 o r프로젝트 이름 (www.oracle.com)
Java는 객체지향 언어!
객체지향 언어의 특징
정보은닉 information hiding
상속 inheritance
다형성 polymorphism (중요! 70%)
캡슐화 encapsulation (+ 추상화 abstraction)
정보 은닉을 하지 않고 프로그램을 만들어 사용자에게 제공했을 때,
사용자가 클래스의 데이터에 직접적으로 접근했으나(예를 들어 논리적 오류를 가진 값을 대입하는 등으로) 에러가 발생하지 않고(컴파일 오류가 발생하지 않고)프로그램이 실행되어 원래의 프로그램의 의도와 전혀 다른 결과가 도출되는 문제가 생길 수 있다. (⇒이것은 프로그램을 잘못 만든 것이긴 함.)
이런 문제들을 방지하기 위해서 접근 제한자를 이용해 외부에서의 직접적인 접근 권한을 제한하고 기능(메소드)을 통해 간접적으로 접근하도록 유도하는 것이다. (그래야 논리적 오류를 가진 값 등을 가지고 접근할 때 컴파일 오류로 이어지도록 만들 수 있다.)
정보은닉의 기본 원칙에 따라 인스턴스 변수는 public으로, 인스턴스 변수에 접근하기 위한 메소드 들은 public으로 선언하는 것이 관례이다.
클래스 정의 대상: public, default (class앞에 아무것도 안 붙인것이 default)
인스턴스변수와 메소드 대상: public, protected, default, private (4가지 모두)
public
모든 파일에서 접근 가능, 어디서든 인스턴스 생성이 가능하다.
public클래스는 외부에 노출시키기 위한 클래스이다.
열어보지 않아도 파일 이름만으로 내용을 유추할 수 있어야한다.
하나의 소스코드에는 하나의 public 클래스만 만들 수 있다.
public 클래스의 이름은 .java의 이름과 동일해야한다.
public class AAA{ //파일의 이름은 public클래스이기 때문에 AAA.java여야만 함
...
}
default
패키지로 묶인 클래스 내에서만(같은 패키지 내에서만) 인스턴스 생성을 허용한다.
이름 앞에 접근 제한자를 붙이지 않으면 defalut이다.
(= 아무 선언도 하지 않은 것, default는 키워드가 아니다.)
class ZZZ{ //.java 파일이름을 ZZZ외에 다른것으로 정하는 것도 가능함
...
}
===================================
가위, 바위, 보 중 하나를 입력하세요.
가위
바위
졌습니다.
계속하시겠습니까?(Y/N)
y
가위, 바위, 보 중 하나를 입력하세요.
바위
바위
비겼습니다.
계속하시겠습니까?(Y/N)
n
프로그램을 종료합니다.
import java.util.*;
public class ScannerTest {
public static void main(String[] args) {
while(true) {
System.out.println("가위, 바위, 보 중에 하나를 내세요.");
Scanner sc = new Scanner(System.in);
String ans = sc.next();
RockScissorsPaper game = new RockScissorsPaper(ans);
game.getResult();
System.out.println("계속하시겠습니까? Y/N");
char replay = sc.next().charAt(0);
if (replay == 'y' || replay == 'Y') {
continue;
}else {
break;
}
}
System.out.println("게임을 종료합니다.");
}
}
public class RockScissorsPaper {
private int computer;
private String me;
public RockScissorsPaper(String itsMe){
this.me = itsMe;
}
public void getResult() {
computer = (int) (Math.random() * 3 + 1);
if(computer == 1 ) {
System.out.println("컴퓨터: 가위");
}else if(computer == 2) {
System.out.println("컴퓨터: 바위");
}else {
System.out.println("컴퓨터: 보");
}
if((me.equals("가위")) && (computer == 1)) {
System.out.println("비겼습니다.");
}else if((me.equals("가위")) && (computer == 2)) {
System.out.println("졌습니다.");
}else if((me.equals("가위")) && (computer == 3)) {
System.out.println("이겼습니다.");
}else if((me.equals("바위")) && (computer == 1)) {
System.out.println("이겼습니다.");
}else if((me.equals("바위")) && (computer == 2)) {
System.out.println("비겼습니다.");
}else if((me.equals("바위")) && (computer == 3)) {
System.out.println("졌습니다.");
}else if((me.equals("보")) && (computer == 1)) {
System.out.println("졌습니다.");
}else if((me.equals("보")) && (computer == 2)) {
System.out.println("이겼습니다.");
}else if((me.equals("보")) && (computer == 3)) {
System.out.println("비겼습니다.");
}
}
}