자바의 동작 원리
소스 -> 컴파일러 -> 결과물 -> 가상머신
[ 소스 ]
.java
[컴파일러]
javac
java파일 -> class 파일로
[결과물]
class 파일
[가상머신]
JVM
운영체제마다 다른 JVM이 환경에 맞게 클래스파일을 실행
name이라는 문자열 변수를 선언하고 Fido라는 값을 대입한다
myDog라는 Dog클래스 변수를 선언하고 new Dog(String name, int size) 생성자를 이용하여 인스턴스를 할당한다. 그리고 그 안의 매개변수로는 Fido, 27이 들어갔다.
x라는 정수형 변수를 선언하고 size 변수를 참조하여 27인 값을 얻어내고 이후 -5 한 결과값인 22를 x에 대입한다
조건문을 마주한다. x는 22이므로 15보다 크다. 따라서 myDog.bark(8); 코드는 실행되지 않는다.
반복문을 마주한다. 조건식을 마주한다. x는 3보다 크므로 myDog.play() 매서드가 실행된다.
정수형 배열 numList에 순서대로 2, 4, 6, 8 값인 배열을 생성하여 할당한다.
System 클래스의 정적필드인 out에 접근하여 print() 매서드를 호출하고 안에 값은 “Hello” 문자열을 인자값으로 전달한다. 그러면 콘솔에 “Hello”가 출력된다.
마찬가지로 인자값이 출력되는데 대상 인자값은 문자열 + 값 은 자동으로 문자열 + 값.toString() 매서드의 결과이고, toString()의 결과는 문자열이다 따라서 문자열+문자열이 되는데 이는 붙여진 하나의 문자열이 된다. 따라서 Dog: Fido 가 출력된다.
문자열 num에 문자열 “8”을 대입한다.
정수형 변수 z에 문자열 인자값을 정수형으로 바꿀 수 있는 매서드인 parseInt(String str) 그리고 그게 정의되어있는 Integer 클래스를 가져와 호출하여 문자열을 정수형으로 바꾼뒤에 대입한다. parseInt는 static 매서드이기에 인스턴스 없이도 기능 호출이 가능하다.
this 클래스의 정체가 뭔지는 모르겠으나 this에 정의된 readTheFile(String str) 매서드를 호출한다. 넘겨준 인자값의 정체는 .txt 인걸로 보아 경로를 문자열로 바꾼 타입과 똑같다. 해당 매서드는 경로의 파일을 읽어서 출력하는걸로 보인다.
자바 코드의 구조
소스파일 ( 클래스 ( 메서드 ( 명령문 ) ) )
클래스의 구조
JVM vs Compiler
JVM 바이트파일을 읽어서 실행시키는 주체
-> Compiler 그 기계어로 대응되는 바이트파일을 주체
-> but 기계어는 인간이 직접 쓰는게 불가능한것은 아님
-> but 기계어를 직접 쓰는 행위는 생산력도 저하될 뿐더러 컴파일러의 에러 탐지 기능도 못쓰기에 힘들어짐.
-> JVM은 런타임중 발생하는 예외 및 보안 문제를 잡는 걸 한다.
-> compiler 그 외 99퍼센트 예외들을 체크하게 된다.
명령
1. main 메서드: JVM을 시작하라는 명령.
2. 명령문: 그냥 동작을 실행하는 것. 선언, 대입, 메서드 호출
3. 반복문: 여러 번 반복하는 것. for, while
4. 조건문: 조건에 따라 무언가를 하는 것 if/else
문제풀이
조건에따른 분기문
3
println
println
3
코드 자석
package onechapter;
public class Shuffle1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int x=3;
while(x>0) {
if(x>2) {
System.out.print("a");
}
x=x-1;
System.out.print("-");
if(x==2) {
System.out.print("b c");
}
if(x==1) {
System.out.print("d");
x=x-1;
}
}
}
}
연습문제
A
일단 x를 컨트롤하지 않는 이상 무한 반복할것이다. 그리고 출력도 안일어난다.
x++;를 반복문 안에 추가
B
문제 없이 돌아가긴 하지만… 모든 X에대한 검사 자체는 일단 안되는 상황. 2일 경우에만 유일하게 출력될것..
이게 의도라면 뭐 문제 없어보이긴하네용
C
독립적인 코드라면 main 매서드가 없기 때문에 실행 자체가 안될것입니다~ main 안에 구현되어 있어야 됩니다.
낱말퀴즈

while
void
매칭
수영장 퍼즐
역대급 난이도다… 코테보다 어렵다. 이런게 리얼 퍼즐인듯 자괴감 느끼고 괴롭다. 진신 2시간을 삽질하다가 이런식으론 평생을 못풀거 같아서.. 좁혀 지질 않아.. 규칙성을 못찾겠음
답지보고..
package onechapter;
public class PoolPuzzleOne {
public static void main(String[] args) {
int x = 0;
while(x<4) { //크게 돌려면 x<4 밖에 없음
System.out.print("a"); //첫 시작에 선택권이 없음
if(x<1) {
System.out.print(" "); //1번째 0일때만 실행되는 공백
}
System.out.print("n"); //다음은 n
if(x>1) {
System.out.print(" oyster"); //3번째 2일때만 실행되는 띄어쓰기 포함된 oyster
x=x+2; //반복문 탈출
}
if(x==1) {
System.out.print("noys"); //2번째 1일때만 실행되는 noys느 띄어쓰기가 없음
}
if(x<1) {//1번째 0일때만 실행되도록 조건문
System.out.print("oise ");//1번째 0일때만 oise를
}
System.out.println();
x=x+1;
}
}
}
출처
헤드퍼스트 자바 https://www.hanbit.co.kr/store/books/look.php?p_code=B4988031598
헤드 퍼스트 자바(3판)
두뇌를 자극하며 한 걸음씩 배우는 자바 학습법. 친절한 설명과 실전 예제로 직접 체험하며 배우는 자바 프로그래밍
www.hanbit.co.kr