📚 책 소개하기

내가 사용한 자바완전정복 책 링크!
ㄴ 김동형 지음, 이지스퍼블리싱



 

: 출처 예스24 홈페이지

 

 

이 책을 고르게 된 이유는 친구의 추천이었다. 굉장히 꼼꼼하게 적혀있어 이해하기 쉽다는 이유로 친구는 이 책을 골랐다고 했다. 나도 그래서 그냥 따라샀다. 실제로 책을 살펴보니 굉장히 꼼꼼하게 정리되어있다. 다른 책은 본 적이 없어 비교가 불가하지만, 내 생각으론 처음 자바를 공부한다면 이 책을 가지고 충분히 따라갈 수 있을 듯 하다. 모두들 화이팅!!

 

 

🐰

 


 

✔️   절차지향형 VS 객체지향형_ 210p

 

절차지향형

: 이야기를 순서대로 써 나가듯이 프로그램을 구성하는 방식

절차 1. 자동차의 컬러와 엔진의 종류를 지정
절차 2. 운전자의 이름, 면허번호를 지정
절차 3. 운전자는 자동차를 운전한다. 

 

 

 

 객체지향형

프로그램에서 사용되는 객체를 생성하고, 각 객체에 포함된 데이터와 기능을 상호 호출함. 객체에 포함된 데이터는 속성 또는 필드, 기능은 메서드라고 함.

 

 

 


 

 

 

 

✔️   클래스 구조 살피기_ 212p

 

  객체지향 문법 요소

일반 클래스, 추상 클래스, 인터페이스

 

 

클래스 멤버 : 필드, 메서드,이너클래스   /   생성자

public class OuterClass {

    // 필드
    private String name;
    private int age;

    // 생성자
    public OuterClass(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 메서드
    public void displayInfo() {
        System.out.println("Name: " + name);
        System.out.println("Age: " + age);
    }

    // 이너 클래스
    public class InnerClass {
	...
    }

    // 메인 메서드
    public static void main(String[] args) {
        // OuterClass 인스턴스 생성
        OuterClass outer = new OuterClass("sori", 99);
        outer.displayInfo();

    }
}

 

 

 

 


 

 

 

✔️   객체의 생성과 활용_ 215p

 

  객체 생성하기

OuterClass outer = new OuterClass("Alice", 99);
힙메모리에 OuterClass의 인스턴스를 생성했다. 이 객체는 Alice와 99라는 값이 저장된다. 그리고 OuterClass 필드의 name과 age는 Alice와 99로 값이 초기환된다. outer는 참조 변수로, 실제 데이터를 저장하는 것이 아닌 힙 메모리의 위치값을 가리키는 변수를 말한다. 그렇기에 outer가 가리키는 곳에 Alice와 99가 있을 것이다.

'OuterClass("Alice", 99)로 만든 객체를 힙 메모리에 넣고, 위칫값을 OuterClass타입의 참조 변수 outer에 저장하라!'

 

 

 

 

  객체 생성에 따른 메모리 구조

OuterClass outer = new OuterClass("Alice", 99);
OuterClasss는 클래스 영역, 참조 변수 outer는 스택 영역, 생성자로 만들어진 객체는 힙 메모리에 위치한다. 여기서 객체 내에 메서드 영역의 위치만 가리키고 있다. 그 이유는 모든 객체의 속성은 달라도 같은 메서드를 공유하기 때문에 메서드는 한 번만 만들면 된다. 그래서 객체 내에 메서드 영역을 가리키고 그 메서드는 클래스 영역에 존재하게 된다.

 

 

 

 


 

 

 

✔️   포인트 연산자_ 218p

 

  참조 변수명.필드명 or 참조 변수명.메서드명()

해당 위치에 있는 객체 안을 보라

class A {
    int m = 3;
    void print() {
        System.out.println("객체 생성 및 활용");
    }
        }



public class CreateObjectAndUsageOfMembers {

    public static void main(String[] args) {

        A a = new A();

        a.m = 5;
        System.out.println(a.m);

        a.print();

    }
}
a의 m 필드 값이 5로 변경되었다. 그렇기에 a.m은 5가 출력된다. a.print( )는 A 클래스의 print를 불러온다. a.print의 결과값은 객체 생성 및 활용이 된다. 

 

 

 

 

 


📚 책 소개하기

내가 사용한 자바완전정복 책 링크!
ㄴ 김동형 지음, 이지스퍼블리싱

 

: 출처 예스24 홈페이지

 

 

이 책을 고르게 된 이유는 친구의 추천이었다. 굉장히 꼼꼼하게 적혀있어 이해하기 쉽다는 이유로 친구는 이 책을 골랐다고 했다. 나도 그래서 그냥 따라샀다. 실제로 책을 살펴보니 굉장히 꼼꼼하게 정리되어있다. 다른 책은 본 적이 없어 비교가 불가하지만, 내 생각으론 처음 자바를 공부한다면 이 책을 가지고 충분히 따라갈 수 있을 듯 하다. 모두들 화이팅!!

 

 

🐰

 


 

 

✔️  객체 생성시 주소값_ 189p

 

• 객체 안의 값을 변경하면 새로운 객체를 생성

String str1 = new String("안녕");
String str2 = str1;
str1 = "안녕하세요";
System.out.println(str1);
System.out.println(str2);

 

new 연산자를 사용하여 객체를 생성했다. new 연산자는 인스턴스(메모리 위에 올라간 객체)를 생성하는데, 메모리 영역 중 힙 영역에 데이터를 저장할 공간을 할당받는다. 그 공간의 참조값을(여기선 str1과 str2가 된다) 객체에게 반환하여 주고 이어서 생성자를 호출한다.

순서가 중요하다. str1에 "안녕"이 들어가는 것이 첫번째가 된다. 그 후 두번째가 str1이 str2에 들어가는 것으로, str2는 "안녕"을 가지게 된다. 세번째에 str1이 "안녕"에서 "안녕하세요"로 변경이 된다. 

출력이 될 땐 이 순서에 맞춰 출력이 된다. str1은 마지막 코드 "안녕하세요"로 변경된 바가 있으니 "안녕하세요"로 출력이 될 것이다. str2는 "안녕"이 유입된 후 변경된 것이 없으니 여전히 "안녕"을 가리키고 있을 것이다. 

메모리는 [ 메서드(클래스) 영역 - 스택 영역  - 힙 영역 ]으로 되어있다. 이때 String은 메서드 영역에 올라가고 str1과 str2의 내용이 힙영역의 몇 번지에 있을 건지에 대한 정보를 스택 영역에 보관한다. 처음에 스택 영역에서 100번지에 str1의 내용이 있다고 가리킬 경우 힙 영역 100번지에 가면 "안녕"이 있을 것이다. 그 후 str1을 그대로 str2에 저장했으니 str2도 똑같이 100번지에 "안녕"을 가리키고 있을 것이다. 여기서 str1이 "안녕하세요"로 바뀌면 str1은 다른 번지에 "안녕하세요"가 있게 될 것이다. 그리고 str2는 여전히 똑같이 100번지를 가리키고 있을 것이다.

 

 

 

 

 

• 배열과 차이점

int[] array1 = new int[] {3, 4, 5};
int[] array2 = array1;
array1[0] = 6; array1[1] = 7; array[2] = 8;

System.out.println(Arrays.toString(array1));
System.out.println(Arrays.toString(array2));

 

배열에 3과 4, 5를 array1에 넣었고, array2는 array1과 동일한 데이터를 가진다. 이때 array1에 대한 데이터를 6과 7, 8로 수정해보겠다. 분명 위에서 문자열을 수정했을땐 두 객체의 값이 같이 수정되지 않았다. 하지만 배열은 다르다. 배열은 번지에 새로운 값이 입력되면 다른 번지에 데이터를 새롭게 만드는 것이 아닌, 본래의 위치에 있던 데이터를 수정하여 값을 넣게된다.

그렇기에 결과는 array1과 array2 모두 6,7,8을 출력하게 된다.

 

 

 

 

 

• 리터럴로 입력한 데이터의 차이

String str1 = new String("안녕");
String str2 = "안녕";
String str3 = "안녕";
String str4 = new String("안녕");

System.out.println(str1 == str4);
System.out.println(str2 == str3);
str2와 str3은 리터럴을 바로 입력한 데이터가 되며, 그 데이터는 서로 같은 값을 가진다. 만약 이렇게 문자열 리터럴 방식으로 String 객체를 생성할 경우, JVM은 먼저 String Pool에서 해당 문자열이 있는지 확인한다. 그렇게 같은 문자열이 있다는 것이 확인되면 기존 문자열 객체의 참조를 반환하게 되고 동일한 메모리 주소를 공유하게 된다.

new 연산자로 객체를 생성할 경우 String Pool이 작동하지 않는다. new는 매번 새로운 메모리 공간에 객체를 생성하고, 동일한 값이라도 메모리 주소는 달라지게 된다.

결론적으로 str1과 str4는 서로 다른 주소값을 가진다. 그리고 str2와 str3은 서로 같은 주소값을 가진다. 

 

 

Q. new가 정확히 무엇인가?

A. new 연산자는 객체를 생성하는 방법 중, 새로운 메모리 공간에 객체를 생성하는 방법이다. 외부에서 값을 변경할 때 다른 객체와 분리되어 값이 변경하길 원할 경우 new 연산자를 사용하여 객체를 정의하면 된다.

 

 

 

 


 

 

 

 

✔️  + 연산_ 195p

 

• 문자열 + 문자열 연산

String str1 = "안녕" + "하세요" + "!";
System.out.println(str1);
객체는 몇 개 만들어질까? 처음에 "안녕"과 "하세요" 그리고 "!"까지 3개의 객체가 생성될 것이다. 그 후 + 연산자로 연결이 될 것이다. "안녕" + "하세요"로 "안녕하세요"가 만들어져 총 4개의 객체가 되고 "!"가 연결되며 "안녕하세요!"가 완성되어 총 5개의 객체가 만들어질 것이다.

 

 

 

• 자료형에 따른 + 연산

System.out.println(1 + 2 + "안녕");
System.out.println("안녕" + 1 + 2);
첫번째 코드부터 살펴보면 연속해서 나오는 1과 2로 자료형이 숫자 자료형으로 동일하다. 이렇게 동일한 자료형이 연달아 나올 경우 더하기 연산으로 작용하여 3 + "안녕" 형태로 이뤄지게 된다. 하지만 두번째 코드처럼 "안녕"과 1이 +연산자로 연결될 경우 다른 자료형으로 안녕1이 되고 그 후에 나오는 2 또한 안녕1로 1이 있어도 숫자 자료형으로 인식하지 않기 때문안녕12가 최종적인 값이 될 것이다.


📚 책 소개하기

내가 사용한 자바완전정복 책 링크!
ㄴ 김동형 지음, 이지스퍼블리싱



: 출처 예스24 홈페이지

 

 

이 책을 고르게 된 이유는 친구의 추천이었다. 굉장히 꼼꼼하게 적혀있어 이해하기 쉽다는 이유로 친구는 이 책을 골랐다고 했다. 나도 그래서 그냥 따라샀다. 실제로 책을 살펴보니 굉장히 꼼꼼하게 정리되어있다. 다른 책은 본 적이 없어 비교가 불가하지만, 내 생각으론 처음 자바를 공부한다면 이 책을 가지고 충분히 따라갈 수 있을 듯 하다. 모두들 화이팅!!

 

 

🐰


 

✔️  1차원 배열_ 151p

동일한 자료형을 묶어 저장하는 참조 자료형

 

 

• 참조자료형

: 실제 값을 갖는것이 아닌 데이터가 저장된 메모리의 “주소 값”을 가지는 자료형이며, 해당 값은 객체를 참조하는 변수 타입을 의미한다.

 

 

- 참조자료형 출처

 

[Java] 자료형(Data Type) 이해하기 : 기본 / 참조 자료형, 래퍼 클래스

해당 글에서는 자료형 중 기본 자료형, 참조 자료형, 래퍼 클래스에 대해 이해하고 각각을 비교하여 이해를 돕기 위한 목적으로 작성을 하였습니다. 1) 기본 자료형(Primitive Data Type) 💡 데이터를

adjh54.tistory.com

 

 

 

 

• 자바의 메모리 구조

: 클래스-정적-상수- 메서드 영역 , 스택 영역(모든 지역 변수 위치), 힙 영역(객체가 위치하는 공간)

 

 

Q. 전역변수와 지역변수란?

A. 전역변수는 프로그램의 모든 영역에서 접근할 수 있는 변수로, 함수 외부, 특히 모듈의 최상위 레벨에서 선언한다. 그렇다면 지역변수한정된 영역인 블록, 함수, 메서드 내부에서 사용되는 변수를 말한다.

Class example {

	int globalVar = 1; // 전역변수
    
    void method() {
    	int localVat = 2;  // 지역변수
    }
}​

 

 

 

- 전역변수와 지역변수 예제 출처

 

지역변수와 전역변수 이해하기 예시

웹 프로그래밍에서 효율적인 프로그램 설계를 위해 변수를 적절히 사용하는 것은 필수적인데, 특히 변수의 유효 범위(scope)와 생명주기(lifetime)를 이해하는 것을 매우 중요합니다. 이와 관련하여

developmentrecord.tistory.com

 

 

 

 

• 기본 배열과 객체 대입 배열

// 기본적인 배열 형태
new int[3];

// 배열 자료형 변수에 객체 대입하기
int[] a = new int[3];

// 값 입력하기
a[1] = 3;
a[2] = 2;
a[3] = 1;

 

1.  int는 배열 자료형이다.
2.  a는 참조 변수다.
3.  new는 힙 메모리에 넣어라를 뜻한다.
4.  int[3]은 int 자료형 3개를 저장할 수 있는 공간이다.

a는 참조변수로 실제 데이터 값을 저장하는 것이 아니다. 실제 데이터값의 '위치값'을 저장하는 것이다.  스택 영역엔 주소값을 그리고 이 주소값을 가지고 힙 영역에 접근한다. 즉 힙 영역에 배열이 저장되어있다. 

 

 

 

 

• 1차원 배열의 다양함

// 생성 후 값 대입
int[] a = new int[3]; // 강제초기화
a[0] = 3;
a[1] = 4;
a[2] = 5;


// 생성과 함께 값 대입
int[] a = new int[]{3, 4, 5} // 강제초기화 생략


// 대입할 값만 입력 (분리 불가능)
int[] a = {3, 4, 5}


// 선언과 객체 분리 가능
int[] a;
a = new int[]{3, 4, 5}

 

Q. 배열을 어떻게 선언하는지에 따라 사소한 기능적인 차이가 있는가?

A. 두 배열을 어떻게 선언하는지에 따른 기능적 차이점은 없다. 코드의 가독성, 유연성, 명확성을 높이기 위해 다른 형태의 배열이 존재한다. 

 

 

 

 

• 참조 변수와 배열 객체의 값 초기화

: 모든 변수는 초기화 이후에 출력 가능하다.

 

int a;
int[]b;

System.out.println(a);
System.out.println(b);

 

각 값을 초기화하지 않았기에 출력이 불가능하다. (오류 발생)
int a  = 0;
int[ ]b = null;

 

기본 자료형의 초깃값으로는 '', 참조 자료형의 초깃값으로는 'null' 을 사용한다. 

기본자료형의 기본값
- boolean : false
- 정수 : 0
- 실수 : 0.0

참조자료형의 기본값
- 클래스, 배열 등 : null

 

 

 


 

 

 

✔️  참조자료형 배열의 특징_ 151p

참조자료형은 기본자료형과 다르게 복사 값을 수정하면 본래 값도 변경된다.

 

 

 

• 참조자료형 변수 복사

int[] a = {3, 4, 5}
int[] b = a;
b[0] = 7;

System.out.println(a[0]);
System.out.println(b[0]);

 

결과값은 a[0]과 b[0]이 7로 동일하다. 

Q. 왜 복사값을 변경하면 본래값도 변경되는걸까?

A. 참조 자료형 변수를 복사하면 실제 데이터가 복사되는 것이 아니라, 실제 데이터의 위치값을 복사(스택 메모리에 있는)하기 떄문이다. 그렇기에 하나의 참조 변수를 이용해 데이터를 수정하면 다른 참조 변수가 가리키는 데이터도 변하게 되는 것이다.

 

 

Q. 기본자료형은?

A. 스택 메모리에 실제 데이터값을 저장하기 때문에 기본 자료형 변수를 복사하면 실제 데이터값 1개가 복사된다. 그렇기에 아무리 변경해도 원본 값은 영향을 받지 않는다.
int a = 3;
int b = a;
b = 7;


a는 여전히 3이 나오고 b는 7이 된다.

 

 


 

 

 

 

✔️  반복문을 이용해 배열 데이터 읽기_ 165p

포인트 연산자를 이용

 

 

• 포인트연산자

int[] a = new int[100]

a[0] = 1, a[1] = 2, ... , a[99] = 100;

for(int i = 0; i < a.length; i++) {
	System.out.println(a[i]);
}

 

포인트연산자는 '해당 참조 변수가 가리키는 곳으로 가라'는 의미이다.
배열참조변수.length는 '배열 참조 변수가 가리키는 곳에 가면 배열 객체가 있는데, 그 배열의 방의 개수를 가져오라'는 의미이다.

 

 

 

 

• for-each문

int[] a = new int[100];
a[0] = 1, a[1] = 2, ... , a[99] = 100;

for(int k: a) {
	System.out.println(k);
}

 

for-each문은 배열이나 컬렉션의 모든 요소를 순회하는데 사용되는 간결한 반목문이다.
for(int k: a)는 for(원소 자료형 변수명: 집합객체)로 배열이나 컬렉션 객체를 통해 자동으로 인덱스를 처리하고, 요소를 순차적으로 가져와 변수에 할당한다.

 

 

- for each 구문 출처

 

초보 자바 프로그래밍(9) - 반복문 for-each

🔖 INDEX 자바 프로그래밍에서 for-each 문법은 "향상된 for 문" 또는 "for-each 루프"라고도 불리며, 배열이나 컬렉션의 모든 요소를 순회하는 데 사용되는 간결한 반복문입니다. for-each 문법은 기존의

moneylogging.tistory.com

 

 

 

 


 

 

 

✔️  2차원 정방 행렬 배열_ 169p

 

• 1차원 배열과 다른점

: 메모리는 2차원 데이터를 바로 저장할 수 없다. 왜냐하면 메모리가 연속적인 주소 공간으로 구성된 1차원 배열이기 때문이다. 그렇기에 1차원 데이터들로 나눠 2차원 배열을 저장하며 2차원 배열은 1차원 배열을 원소로 포함하고 있는 1차언 배열이라고 생각할 수 있다.

 

Q. 그렇다면 3차원 배열은?

A. 3차원 배열은 2차원 배열을 원소로 포함하는 1차원 배열이다. 행과 열 그리고 면을 포함하여 3차원을 완성한다.

 

 

 

 

• 2차원 배열의 메모리 구조

// 배열 객체를 생성하고 값 대입
int[][] a = new int[2][3];
a[0][0] = 1; a[0][1] = 2; a[0][2] = 3;
a[1][0] = 4; a[1][1] = 5; a[1][2] = 6;

 

 

a.length은 2이다. a인 100번지가 가리키는 곳에 200과 300이 있으니 2가 출력된다.
a[0]은 200번지이며 200번지가 가리키는 곳으로 가니 1과 2, 3이 있다. 그렇기에 a[0].length는 3이 출력된다.

각 주소값이 가리키는 곳의 갯수를 새면 된다.

 

 

 

 

• 행 성분부터 생성하고 열 성분 생성

// 행 성분부터 생성하고 열 성분 생성
int[][] a = new int[2][]

a[0] = new int[]{1,2,3};
a[1] = new int[]{4,5,6};

 

행을 먼저 생성하여 100번지에 있을 행의 갯수를 미리 정해주는 것이다. 열의 개수는 어차피 1차원 배열로 이어지기 때문에 미리 정해주지 않아도 된다.

 

 

 

 

• 배열의 자료형과 함께 대입할 값 입력

: 대괄호 안은 반드시 크기를 지정하지 않는다.

int[][] a = new int[][] {{1, 2, 3}, {4, 5, 6}}

 

 

 

 

• 대입할 값만 입력하기

// 대입할 값만 입력
int[][] a = {{1,2,3} , {4,5,6}};

 

 

 

 


 

 

 

 

✔️  2차원 비정방 행렬 배열_ 178p

행마다 열의 길이가 다른 2차원 배열

 

 

• 이중 for문을 이용한 2차원 배열 원소 출력

int[][] a = {{1, 2}, {3, 4, 5}}

for(int i = 0; i < a.length; i++) {
	for(int j = 0; j < a[i].length; j++) {
    		System.out.println(a[i][j]);
    }
}

 

열의 길이가 다르니 열을 출력할 때  j < a[i].length;를 써준다.

 

 

 

 

• 이중 for-each문을 이용한 2차원 배열 원소 출력

int[][] a = {{1, 2, 3}, {4, 5, 6}};

for(int[] m: a) {
	for(int n: m) {
    		System.out.println(n);
     }
}

 

 

m은 배열 a의 각 행을 참조하는 1차원 배열이 된다. ( a[0]과 a[1] )
n은 각 행 안에 있는 원소들이 된다. a[0]의 있는 1,2,3이 각 n이 된다.

 

 


📚 책 소개하기

내가 사용한 자바완전정복 책 링크!
ㄴ 김동형 지음, 이지스퍼블리싱



: 출처 예스24 홈페이지

 

 

이 책을 고르게 된 이유는 친구의 추천이었다. 굉장히 꼼꼼하게 적혀있어 이해하기 쉽다는 이유로 친구는 이 책을 골랐다고 했다. 나도 그래서 그냥 따라샀다. 실제로 책을 살펴보니 굉장히 꼼꼼하게 정리되어있다. 다른 책은 본 적이 없어 비교가 불가하지만, 내 생각으론 처음 자바를 공부한다면 이 책을 가지고 충분히 따라갈 수 있을 듯 하다. 모두들 화이팅!!

 

 

🐰


 

✔️  switch 선택 제어문_ 119p

점프 위치 변숫값에 따라 특정 위치(case)로 이동해 구문을 실행하는 선택 제어문

 

 

일반 switch( )

int a = 2;

switch(a) {
case 1:
	System.out.println("A");
case 2:
	System.out.println("B");
case 3:
	System.out.println("C");
default:
	System.out.println("D");
}
1)  switch(a)에서 a 안에 들어가는 숫자는 2이다.
2)  case 2로 이동하여 B를 출력시킨다.
3)  break 문이 없으므로 case3과 default도 실행된다.

 

 

 

break가 있는 switch( )

int a = 8;

switch(a) {
case 10:
case 9:
case 8:
case 7:
	System.out.println("Pass");
    	break;
default:
	System.out.println("Fail");

 

1)  7점 이상은 Pass, 그 이하는 Fail을 주는 코드로 간결하게 작성했다.
2)  switch(a)의 a에 들어갈 숫자는 8로 case 8에 해당한다.
3)  하지만 case 8에 별다른 조건이 없으므로 case 7로 이동한다.
4)  Pass를 결과로 출력시킨다.
5)  break; 문을 통해 빠져나간다.

 

 

 

Q. if 선택 제어문과 switch 선택 제어문의 차이점은 무엇인가?

A.
if 문어떤 값을 출력하느냐에 따라 조건식을 몇 개 비교할 것인지 달라져 값에 따라 속도가 달라진다. 반면 switch문은 동일하게 한 번의 점프만을 수행한 후 실행되므로 모든 출력 속도가 동일하다.

 

 

 


 

 

 

✔️  while 반복 제어문_ 129p

소괄호 안의 조건식이 true인 동안 반복은 지속된다. (횟수가 아닌 특정 조건까지 반복)

 

 

기본 while

int a = 0;

while(a < 10) {
	System.out.println(a);
    a++;
}

 

1)  int a = 0은 초기식이다.
2)  while(조건식)이다.
3)  System.out.println(a);는 실행구문이다.
4)  a++;는 증감식이다.

 

 

 


 

 

 

✔️  do - while 반복 제어문_ 134p

while문과 비슷한 반복 제어문, 반복 실행의 순서에만 차이가 있다.

 

 

 기본 do - while

a = 0;

do {
	System.out.print(a + " ");
    	a++;
} while (a < 0);

 

1)  a = 0;은 초기값이 된다.
2)  do 괄호 안에는 실행구문과 증감식이 있다.
3)  그 후 while (조건식);이 있다.

 

 

Q. while문과 do-while문의 차이점은?

A. while문은 조건식이 먼저 나타나있다. 조건이 false이면 괄호 안으로 들어가지 않고 끝나기 때문에 한 번도 실행되지 않는다. 그런데 do - while문은 조건식이 마지막에 있다.  그렇기에 한 번은 실행된다. 

 

Q. do-while문을 쓰는 경우는 언제인가?

A. 조건이 만족하지 않아도 무조건 한 번은 돌아야하는 경우 do-while문을 쓴다. 예시로 메뉴로 사용자가 유효한 선택을 할 때까지 떠야하는 경우 혹은 게임이 한 번은 무조건 실행되고 그 후 사용자가 선택시 다시 실행되는 경우에도 속한다. 

 

 

 


 

 

 

✔️  break 제어 키워드_ 139p

if문을 제외한 가장 가까운 중괄호를 탈출하는 제어키워드

 

 

 

간단한 break 

for (int i = 0; i <10; i++) {
	System.out.println(i);
  	break;
}

 

1)  i =0 일 때 실행된다.
2)  System.out.println(i);에 0이 출력된다.
3)  증감되지 않고 바로 아래줄에 있는 break;를 괄호 밖으로  나간다. 

 

 

 

 

if문 안에 있는 break

for(int i = 0; i < 10; i++) {
	if(i == 5) {
    	break;
    }
    System.out.println(i);
}

 

1)  if( i == 5)에 맞춰 i가 5가 될 때까지 i는 증가한다.
2)  i가 5가 되면 반복문에서 빠져나온다.
3)  system.out.println(i);가 실행된다. 
4)  if문 자체가 break를 실행할 조건문이 되는 것이다.

 

 

 

 

레이블을 이용한 break

out:
for(int i = 0; i < 10; i++) {
	for(int j = 0; j <10; j++) {
    		if(j == 3)
        		break out;
        	 System.out.println(i + "," + j);
     }
}

 

1)  이중 for문으로 들어간다.
2)  if문의 조건에 맞춰 3이 되면 break가 실행된다.
3)  for문을 완전히 벗어나게 된다.

 

 

 

 


 

 

 

 

✔️  continue 제어 키워드_ 143p

닫힌 중괄호 역할을 하는 제어키워드

 

 

 

if 문과 함께 사용된 continue

for(int i = 0; i < 10; i++) {
	if(i == 5) {
    	continue;
    }
    System.out.println(i);
}

 

1)  if문의 조건에 맞춰 i가 5가 되었다.
2)  countinue에 맞춰 i == 5에 대한 출력값은 넘어가게 된다.
3)  i의 출력값으로는 0,1,2,3,4,6,7,8,9 까지 나오게 될 것이다.

 

 

 

📚 책 소개하기

내가 사용한 자바완전정복 책 링크!
ㄴ 김동형 지음, 이지스퍼블리싱



: 출처 예스24 홈페이지

 

 

이 책을 고르게 된 이유는 친구의 추천이었다. 굉장히 꼼꼼하게 적혀있어 이해하기 쉽다는 이유로 친구는 이 책을 골랐다고 했다. 나도 그래서 그냥 따라샀다. 실제로 책을 살펴보니 굉장히 꼼꼼하게 정리되어있다. 다른 책은 본 적이 없어 비교가 불가하지만, 내 생각으론 처음 자바를 공부한다면 이 책을 가지고 충분히 따라갈 수 있을 듯 하다. 모두들 화이팅!!

 

 

🐰


✔️  전위형, 후위형 증감 연산자_ 86p

 

 전위형

: ++가 변수보다 먼저 나오는 것

int a = 3;
int b = ++a;
System.out.println(a);
System.out.println(b);

 

1) int b = ++a
    : a 앞에 ++가 먼저 있는 전위형으로 a의 값은 1 상승한 4가 된다.
2) int b = ++a
    : a는 4로 변경된 값은 왼쪽에 있는 b에 넣어준다.
3) System.out.println(a);
    : a의 값은 변경되었다. ++가 앞에 있게되면서 a의 값이 변경되고 그 후 b에 넣어주게 된 것이다.
       그러므로 a값은 4가 된다.
4) System.out.println(b);
    : b의 값은 4가 된다.

 

 

 

 

 후위형

: ++가 변수보다 뒤에 나오는 것

int c = 3;
int d = c++;
System.out.println(c);
System.out.println(d);

 

1) int d = c++;
    : c의 값이 먼저 d에 들어간다. 그렇게 d의 값은 3이 넣어진다.
2) int d = c++;
    : 그 후에 c의 값이 1 상승한다. 그렇게 a는 4가 된다.
3) System.out.println(c);
    : c는 1 상승한 값이 4가 된다.
4) System.out.println(d);
    : d는 ++가 나오기 전 a의 값을 담았기에 3이 된다.

 

 

 

 


 

✔️  논리연산자와 비트연산자 차이점_ 100p

 

 논리연산자

: 쇼트섯킷으로 연산을 수행하는 과정에서 결과가 이미 확정됐을 때 나머지 연산과정을 생략한다.

 

int a, b, c;

a = 3; b = 3; c = 3;

System.out.println(false && a++ > 6);
System.out.println(true || b++ > 6);
System.out.println(true ^ c++ > 6);

System.out.println(a);
System.out.println(b);
System.out.println(c);

 

 

1) System.out.println(false && a++ > 6);
   : 논리연산자쇼트 서킷으로 값이 결정나면 뒤의 계산을 안한다고 했다.
     &&(AND)는 두 값이 모두 true여야 true 값이
최종적으로 나오는데,
    이미 false가 있으므로 굳이 뒤의 계산은 하지 않고 넘어간다.

2) System.out.println(false && a++ > 6);
    : 계산을 하지 않으므로, a는 3으로 그대로 남는다.

3) System.out.println(true || b++ > 6);
    : ||(OR)는 둘 중에 하나만 true여도 true값이 최종적으로 나온다.
     위의 식에선 true가 이미 나오므로 굳이 뒤의 계산은 하지 않고 넘어간다. b는 그대로 3인된다.

4) System.out.println(true ^ c++ > 6);
     : ^(XOR)는 true-false(false-true) 값이 나오면 true이고, true-true 혹은 false-false 값이 나오면 false이다.
      앞에 나온 값이 true이므로 뒷 계산을 쭉 해봐야 최종값을 알 수 있다.

5) System.out.println(true ^ c++ > 6);
     : c++는 4가 되고 그 값이 6보다 큰 지를 묻는다. 4 > 6은 틀렸으므로 (true ^ false)가 된다. 최종값은 true가 된다.

6) 그러면 각 값을 살폈을 때, a와 b는 뒤의 계산을 하지 않았으니 초기 설정된 값 3이 출력된다.
     그리고 c는 계산을 끝까지 했기에 증감되어 4가 나온다.

 

 

 

 비트연산자

int a, b, c;

a = 3; b = 3; c = 3;

System.out.println(false & a++ > 6);
System.out.println(true | b++ > 6);
System.out.println(true ^ c++ > 6);

System.out.println(a);
System.out.println(b);
System.out.println(c);

 

1) System.out.println(false & a++ > 6);
  : 비트연산자는 논리연사자와 다르게 쇼트서킷이 없다. 해당 값이 false로 나오더라고 a의 값은 1 증가하여 4가 되는 것이다.
2) 그래서 불리언값은 논리연사자와 같지만 각 변수의 값은 다르게 된다. 
3) a,b,c 모두 증가하여 4로 출력된다.

 

 

 

 

 


 

 

✔️  삼항연산자_ 103p

(참 또는 거짓) ? 참일 때 연산 결과 : 거짓일 때 연산 결과

 

int a = 2;

int b = (a % 2 == 0) ? 10: 20
System.out.println(b);
1) int b = (a % 2 == 0) ? 10: 20
    : 첫번째로 괄호 안의 계산식으로 봐주면 된다. a는 1로 2로 나눈 나머지값을 묻는데 2로 1을 나눴을 때 나머지 값은 1이된다.
      그러므로 괄호 안의 식은 false가 된다.
2) int b = (a % 2 == 0) ? 10: 20
    : 괄호 식의 값이 true면 10, false면 20의 값이 최종적으로 결정된다.
     1)에서 살펴본 괄호 값의 결과는 false로 b의 값은 20이 된다.

 

 

📚 책 소개하기

내가 사용한 자바완전정복 책 링크!
ㄴ 김동형 지음, 이지스퍼블리싱

 

: 출처 예스24 홈페이지

  


이 책을 고르게 된 이유는 친구의 추천이었다. 굉장히 꼼꼼하게 적혀있어 이해하기 쉽다는 이유로 친구는 이 책을 골랐다고 했다. 나도 그래서 그냥 따라샀다. 실제로 책을 살펴보니 굉장히 꼼꼼하게 정리되어있다. 다른 책은 본 적이 없어 비교가 불가하지만, 내 생각으론 처음 자바를 공부한다면 이 책을 가지고 충분히 따라갈 수 있을 듯 하다. 모두들 화이팅!!

 

 

🐰

 


 

✔️  자료형 선언하기_ 55p

// 자료형 변수 = 값;

int a = 3;
String b = "mybymine";

 

 

 자료형

: 메모리 공간은 목적에 따라 크기와 특징을 나눠준다.

기본자료형 : boolean, byte, short, int, long, chr
참조자료형 : 배열, 클래스, 인터페이스

 

 

• 변수

: 메모리 공간에 부여하는 이름

사물함이 있다고 가정했을시, 사물함은 메모리가 된다.
그리고 그 사물함에 부여된 번호나 문자가 변수가 된다.

 

주의사항
(1) 자료형은 반드시 사용하기 전에 선언한다.
(2) 자료형은 반드시 한 번만 선언한다.

 

 

 

: 변수에 저장되는 값

 

 

 


 

 

 

✔️  이름 작성시 주의사항_ 59p

1. 특수 문자는 밑줄(_)과 달러($) 표기만 사용가능하다.
2. 아라비아 숫자는 사용가능하나 첫번째 자리는 안된다.
3. 자바에서 사용하는 예약어(public, int, static 등)는 사용불가하다.

 

 

 

  변수명을 지을 때 권장 사항

: 낙타표기법

int ourClassNum;

 

 

  상수명을 지을 때 권장 사항

: 상수는 변수와 구분짓기위해 모두 대문자로 사용

final int MY_DATA;

 

 

Q. 상수와 변수의 차이는 무엇일까?
A. 상수는 변할 수 없는, 고정된 값을 의미하고 변수 변할 수 있는 값을 말한다.
    그렇기에 변수 앞에 final을 붙이면 상수가 된다.

 

 

➰ㅤ final에 대하여...

final은 변수, 메소드, 클래스에 붙일 수 있다.
(1) 변수에 붙으면 변경할 수 없는 값, 상수가 된다.
(2) 메소드에 붙으면 override가 제한되는데, 상속받은 클래스에서 해당 메소드를 수정하지 못하게 한다.
(3) 클래스에 붙으면 해당 클래스는 상속이 불가하다.

〰️  final 메소드 관련 예시 〰️ 
class A {
    final void display() {
        System.out.println("mybymine");
    }
}

class B extends A {
    void display() {
        System.out.println("java velog!");
    }
}​


class A에 final void display가 붙으면서 이 값은 변경할 수 없게 됐다.
그래서 class B에서 A를 상속받아 display( )값을 바꿔 출력하려해도 final이 붙어있기 때문에 
override에 실패하게 된다.

 

- final 관련 정보 출처

 

[Java] final 키워드에 대해서 알아보자

안녕하세요. 오늘은 여러분들과 java의 final 키워드에 대해서 알아보려고 합니다. final final 키워드는 변수(variable), 메서드(method), 또는 클래스(class)에 사용될 수 있습니다. 이 final 키워드는 어떤

sabarada.tistory.com

 

 

 

➰ㅤ그렇다면 override는 무엇인가?  

상위 클래스에 정의된 변수 혹은 메소드를 하위 클래스에서 재정의하는 것이다.
(1) 오버라이딩(overriding)은 상속 관계에서만 가능하고
(2) 오버로딩(overloading)은 동일클래스 또는 상속 관계에서 가능하다.

 

- override 관련 정보 출처

 

오버라이드

  Override, Overriding   오버라이드, 오버라이딩(2022-02-02)

www.ktword.co.kr

 

 

 


 

 

✔️  자료형의 종류_ 63p

 

 메모리의 영역

첫번째 영역 - 클래스 영역, 정적 영역, 상수 영역, 메서드 영역

두번째 영역 - 스택 영역 (변수들이 저장되는 공간)

세번째 영역 - 힙 영역 (객체들이 저장되는 공간)

 

 

  기본자료형과 참조자료형

기본 자료형 - int, float, double, char 등 잘 알고있는 자료형

참조 자료형 - class, interface, enum으로 기본 자료형을 기초로 하여 만들어진 자료형

 

 

  실제 데이터 값

기본 자료형: 스택 메모리(두번째영역)에 실제 변숫값을 저장한다

참조 자료형: 실제 데이터값은 힙 메모리에 저장 -> 스택 메모리에 힙 메모리의 위칫값 저장한다.

 

📚 책 소개하기

내가 사용한 자바완전정복 책 링크!
ㄴ 김동형 지음, 이지스퍼블리싱

: 출처 예스24 홈페이지

 

이 책을 고르게 된 이유는 친구의 추천이었다. 굉장히 꼼꼼하게 적혀있어 이해하기 쉽다는 이유로 친구는 이 책을 골랐다고 했다. 나도 그래서 그냥 따라샀다. 실제로 책을 살펴보니 굉장히 꼼꼼하게 정리되어있다. 다른 책은 본 적이 없어 비교가 불가하지만, 내 생각으론 처음 자바를 공부한다면 이 책을 가지고 충분히 따라갈 수 있을 듯 하다. 모두들 화이팅!!

 

 

🐰


✔️  클래스 선언부_ 45p

public class Test {

}

 

 

• public

: 다른 패키지에서도 사용할 수 있다는 의미를 지닌 접근지정자다.

 몇 개의 클래스가 존재하든 최대 1개의 클래스만 public을 포함할 수 있다.

 

접근지정자(접근제한자, Access Modifier)란?
public - protected - private - default로 클래스나 인터페이스 혹은 그들이 가지는멤버의 접근에 제한을 거는 것이다.
9장에서 자세히 알아볼 것이다.

 

 

 

class

: 클래스라는 것을 알려주는 자바 키워드다.

 

Q. 만약 class가 아닌 interface라면?

public interface Test {

}

 

 

 

• Test

: 클래스명 뒤에는 { 내부구성요소를 포함한 } 중괄호가 오며 클래스명은 반드시 소스파일 이름과 일치해야한다.

 

내부구성요소?
필드(Field), 메서드(Method), 생성자(Constructor), 이너 클래스(Inner class)이다.
이 4종류를 제외한 것들은 올 수 없다.

 

 

 

 

 


 

✔️  main( ) 메서드_ 45p

‣ 바이트 코드(.class)가 메서드 영역에 로딩되면 자바 가상 머신은 main( )메서드부터 찾는다.
‣ 실행 이후 가장 먼저 실행되는 메서드가 main( )라는 것이다.

 

public static void main(String[] args) {

}

 

 

 

 static

: 정적 메서드

 

Q. static을 붙이는걸까?
A. main 메서드는 프로그램이 시작할 때 가장 먼저 호출되는 메서드이다.
    static객체의 생성없이 메모리에 할당시켜 메서드를 호출 가능하게 해준다.

    즉, main 메서드는 가장 먼저 실행되기 때문에 객체 생성이 없다.
    그때 static을 붙여주지 않으면 실행할 객체가 없기 때문에 실행이 취소된다.
    하지만 static은 메모리에 항상 상주하도록 설정하기 때문에 객체가 없는 main이 죽지 않게 방지한다.ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ

 

- static 참고한 tistory

 

[JAVA] 자바 public static void main (String[] args) 의미

자바 코드의 기초 자바의 모든 프로그램은 public static void main (String[] args) 함수로 시작합니다. 왜 모든 코드는 위의 구문으로 실행이 되어야 할까요? 이 의미를 파헤쳐 보도록 하겠습니다. ( 자바

mozi.tistory.com

 

 

 

 void

: 리턴 타입으로 메서드가 수행한 작업의 결과를 반환하는 데이터 타입을 의미한다.

 

void는 리턴값이 없음을 나타낸다.
메서드가 어떤 작업을 수행하긴 하지만 그 결과값을 반환하지 않는 경우에 사용된다.

 

- void 참고한 velog

 

자바 void란?

자바의 main 함수에 void라고 쓰여 있는 것을 본 적이 있을 것이다. 지금까지는 별 생각없이 사용했지만 그 쓰임새에 호기심이 생겨 void란 무엇이고 언제 사용되는지 알아보도록 하겠다. 📖 void의

velog.io

 

 

 

 Strings[  ] args

: 매서드의 매개변수로, 문자열을 나타낸다.

 

➰ 이해가 안가서 Chat-GPT씨에게 여쭸다.

java YourProgram arg1 arg2

 

  1. 명령프롬프트나 터미널에 위의 코드를 적어준다.
    여기서 YourProgram은 실행할 클래스 이름, arg1과 arg2는 프로그램에게 전달한 명령줄 인수가 된다.

  2. JVM이 실행되고 JVM이 YourProgram을 찾아 main 메서드를 실행한다.

  3. main 메서드의 매개변수 String[ ] args는 ["arg1", "arg2"]와 같은 형태의 배열로 초기화한다.
    여기서 args[0]에는 첫 번째 인수인 "arg1"이 저장되고, args[1]에는 두 번째 인수인 "arg2"가 저장된다.
System.out.println("첫 번째 인수: " + args[0]);
System.out.println("두 번째 인수: " + args[1]);

 


4. 결과:
    첫 번째 인수: arg1
    두 번째 인수: arg2

내가 이해하기론, 인수의 이름(?)은 문자열로 쓰도록 약속했고
그렇기때문에 그 인수를 제대로 받을 수 있게 main 메서드의 매개변수를 String으로 지정한 것 같다.

나중에 다시 알아보고 싶다... 🥲

 


 

 

👁️‍🗨️ 잘못된 내용이나, 저에게 더 알려주고 싶은 내용은 댓글로 남겨주세요. 🐻

+ Recent posts