。゚(*´□`)゚。

코딩의 즐거움과 도전, 그리고 일상의 소소한 순간들이 어우러진 블로그

[네이버클라우드] 클라우드 기반의 개발자 과정 7기/웹프로그래밍

[NC7기-28일차(6월2일)] - 웹프로그래밍 9일차

quarrrter 2023. 6. 2. 17:12

1교시 조건문

if

1. if문 뒤에 ; 안 찍게 주의. , if문 끝나버림 

2. 여러문장을 if문에 포함하고 싶으면 {}로 묶기

3. if ( ) 안은 반드시 불린데이터여야함. 

4. if~else는 한 문장임. else 혼자는 못 씀. 두 문장 이상일 땐 반드시 { }로 묶어야함. 

(하지만 구글에선 한 문장도 { } 로 묶으라는 지침있음. 나두 습관 들이기)

5. if 문과 else 문 사이에 다른 문장이 올 수 없다.

6. else if 라는 문법은 없음 //if ~ else ~ 만 있다면 블록으로 묶지 않아도 됨

 

    // => if (조건) 문장;
    if (age >= 19) System.out.println("성인이다.1");

    // => 문장을 다른 줄에 놓는 경우가 많다.
    if (age >= 19); // if 문에 빈 문장을 넣을 수 있다.
    System.out.println("성인이다.2");
    // 이런 경우 개발자가 오해할 수 있다.
    // if (조건) 뒤에 문자의 끝을 표시하는 세미콜론을 사용하지 않도록 조심하라!

 

switch

1. break를 반드시 포함하고 있어야함.

2. swicth(변수){ }

3. break문을 쓰지 않으면 계속 이어서 실행된다.

4. case 값엔 변수가 올 수 없고 리터럴만 가능함 // 반드시 상수여야함. 

- 값이 변경되지 않는 final 변수라면 사용할 수 있다.

5. switch(값) { }// 값에는 int 정수, string, 문자열, 상수타입 Enum 올 수 있음 

- 4byte 넘는 값은 안 됨. 부동소수점 안 됨. 불린 안됨. 

6.enum을 사용해서 상수 선언 후 사용가능 

enum Level {
    GUEST, MEMBER, ADMIN
  }

다음과 같이 switch나 case 값으로 enum 타입의 값이 올 수 있다.
    switch (level) {
      case GUEST:
        System.out.println("조회만 가능합니다.");

 

while

조건이 참인 동안  계속 진행 

여러개를 실행하려면 { } 로 묶기

**한 줄이 지나면 어차피 값이 변하기 때문에 후위연산자 쓰기

-continue 사용법: 만나면 다시 조건으로 올라감 

-break: 해당 문장만 나감.

             loop로 묶어서 그 loop 라벨 전체 나가기 가능

 

for

for (변수선언 및 초기화; 조건; 증감문) {문장1; 문장2; ...}

1.for 문에서 선언한 변수는 그 for 문 안에서만 사용할 수 있다

2. 변수선언 및 초기화 & 증감문을 괄호에 안 넣구 밖에 빼도 됨 //이렇게 하지 말기;

3. 다 생략하면 무한루프

4.반복문을 종료한 뒤라도 해당 변수의 값을 사용하고 싶으면, 다음과 같이 반복문 밖에 변수를 선언하라!

5.    // 변수초기화 시키는 문장에 여러 개의 변수를 선언 할 수 있다. (같은 형식만 int면 int)
6.    // 변수 증가문에 여러 개의 문장을 작성할 수 있다.
    for (int i = 1, j = 3, k = 5; i <= 10; i++, j--, k += 2)

7.for문에서 continue 만나면 조건이 아니라, 증감문으로감. ( 그 뒤에 조건으로가겠지)

8.   전체 배열 반복 (for 안에 변수 선언해야함)

    for (String name : names)
      System.out.println(name);

9. 증감은 while보다 for문이 나음 

 

2교시

ex07 메서드 

    // [리턴값을 받을 변수] = 메서드명(아규먼트);
    // - 아규먼트(argument)?
    // => 메서드 블록에 들어 있는 명령을 실행할 때 필요한 값
    // => 즉 파라미터 변수에 넘겨주는 값
    // => 파라미터 변수의 타입과 개수와 순서에 맞게 값을 넘겨줘야 한다.
    // 만약 변수의 타입과 값의 타입이 다르면 컴파일 오류!
    // 만약 변수의 개수와 값의 개수가 다르면 컴파일 오류!
    // 변수 선언 순서와 값의 순서가 다르면 컴파일 오류!
    //
    // - 리턴값을 받을 변수
    // => 메서드 블록을 실행한 후 리턴되는 값을 받을 변수이다.
    // => 메서드가 값을 리턴한다 하더라도 값을 받기 싫으면
    // 변수를 선언하지 않아도 된다.
    // 그러면 리턴 되는 값은 버려진다.
    // => 값을 리턴하지 않는 메서드에 대해 변수를 선언하면 컴파일 오류!
    
    // ## 메서드(method) = 함수(function)?
// - 명령문을 기능 단위로 관리하기 쉽게 별도로 분리하여 묶어 놓은 것.
// - 반복적으로 자주 사용하는 명령문을 재사용하기 쉽도록 별도로 분리하여 묶어 놓은 것.
// - "코드를 관리하기 쉽고 재사용하기 쉽도록 기능 단위로 묶어 놓는 문법"

// ## 메서드 종류?
// 1) 클래스 메서드
// - 클래스에 소속되어 있다.
// - 모든 인스턴스가 공유한다.
// - static이 붙는다.
// 2) 인스턴스 메서드
// - 특정 인스턴스에 대해 사용한다.
// - static이 붙지 않는다.

파라미터가 없는데 아규먼트를 넣으면 안됨 

  static void hello()
  //    hello(100);// 컴파일 오류!
  
  
    static void hello(String name, int age): 파라미터(아규먼트를 받는 변수) name, age
   hello("홍길동", 20); 아규먼트(값) 홍길동, 20

 리턴 타입은 반드시 한 개만 가능하다
 메서드를 리턴한 후에 추가 작업을 수행할 수 없다. 함수 끝 

사용할 곳에 바로 메서드 호출 코드를 둔다.
  System.out.println(hello());

 

  static String hello(String name, int age) {
    String retVal = String.format("%d살 %s님을 환영합니다!", age, name);
    return retVal;
  }
  
  string.format : 문자열을 만드는 역할 
  
  
  
      // hello() 메서드를 실행하고, 그 리턴 값을 변수에 담는다.
    String r = hello("홍길동", 20);
    System.out.println(r);

임시변수 대신 메서드 호출 코드 사용 
앞의 예제와 마찬가지로 리턴 값을 한 번만 사용한다면, 사용할 곳에 메서드 호출 코드를 둬라!
=> 리팩토링 기법 중에서 "replace temp with query" 라 부른다.
    System.out.println(hello("홍길동", 20));

가변 파라미터
  // [리턴타입] 메서드명(타입... 변수) {...}
  // => 0 개 이상의 값을 받을 때 선언하는 방식.

  static void hello(String... names)  // names는 배열 

 

    // 가변 파라미터 자리에 배열을 직접 넣어도 된다.
    String[] arr = {"김구", "안중근", "윤봉길", "유관순"};

    hello(arr);

 

- 가변 파라미터 여러 개 선언 불가

가변 파라미터는 반드시 맨 끝에 와야 한다.

  static void m2(int a, String... names) {} // OK!

 

배열파라미터

여러 개의 배열 파라미터  선언 가능 

순서 상관 없음 


  //    static void m1(String... names, String... emails) {} // 컴파일 오류! 가변
  //    static void m1(String[] names, String[] emails) {} // OK! 배열 

 

  //    => 중간에 다른 타입이 온다 하더라도 안된다.
  //  static void m1(String... names, int a, String... emails) {}// 컴파일 오류! 가변
  //  static void m1(String[] names, int a, String[] emails) {} // OK!배열 

 

 

3교시

매서드 중첩호출

result = plus(plus(plus(2, 3), 4), 5);

 

메서드 호출과 JVM stack 메모리

*프레임:

1. 메인 메서드 호출 되면 jvm stack 에 프레임 생성. 

2. 다음 메서드 호출되면 jvm stack에 프레임 생성.

3. 호출된 메서드 실행 종료 되면 프레임도 삭제됨. 

4. 메인메서드로 돌아가서 남은 작업 실행 

4. 메인 메서드 실행 종료되면 jvm도 종료되고, jvm이 사용한 모든 메모리를 OS 가 강제 회수 한다. 

 

 

오후 수업 

1교시

call by value

호출할 때 주소가 아니라 값이 넘어가는 것.

배열 활용 0320 = 정리하기 

객체 주소 0330 = 정리하기

 

메서드 호출과 JVM stack 메모리

1. main() 호출 - JVM stack 에 main() 프레임 생성

    - 프레임 안에는 main() 메서드에서 사용할 로컬변수 준비

2. swap() 호출 - JVM stack에 swap() 프레임 생성

3. swap() 실행 종료 되면서 swap 프레임 삭제됨

4. main() 으로 return,  남은 거 진행 후 실행 종료

  -main() 실행 종료 = main() 프레임 삭제됨 = JVM 종료 => JVM이 사용한 모든 메모리를 OS가 강제 회수

 

Call by reference & 배열(배열은 Heap에 만들어짐)

1. main() 호출 

 - int[ ] arr = new int [ ] {100, 200};

 - JVM stack에 main()프레임 생성(로컬 변수 arr 생김) , Heap에 arr배열 생성

2. swap(arr)

 - JVM stack에 swap()프레임 생성. main의 arr의 주소 값이 swap의 로컬변수 arr에 전달됨

 - 실행 끝 

3. main()으로 retrun, swap 프레임 삭제됨 

4. main() 작업 끝나고 JVM 종료(JVM이 사용했던 메모리를 OS가 강제 회수)

 

Call by reference & 객체 (0330)

new로 만들어진 객체는 Heap 에 만들어짐(배열도,, )

1. main() 호출

 -MyObject ref = new Myobject(); /JVM stack에 main()프레임 생성(로컬변수 args, ref 생성, heap에 MyObject 객체 생성)

 -ref 안에 Myobject 의 주소 전달

2. swap(MyObject ref) 호출

 - JVM stack에 swap() 프레임 생성(로컬변수 ref, temp생성)

 - 실행 끝

3. main() return, main() 남은거 실행

4. main() 실행 종료, main() 프레임삭제, JVM 종료. 

 

**

Myobject 설계도에 따라 만든 변수(=Myobject의 instance(=객체))들이 Heap에 담김

 

 

0421 

항상 main 메서드 먼저 실행하고  배열 생성은 어느 위치에 하던 상관이 없음 

 

 

0520  args // 지금은 간단하게 이해하기

java -cp  -Exam0520 aaa bbb ccc

자바 실행할 때 aaa bbb ccc 추가하면.. 

new String[3] 한 것과 같은 효과가 일어나고 생성된 배열이 JVM stack의 main 프레임 속 args 로컬변수에 주소가 저장된다.

 

## 8. 스태틱 문법으로 메서드 간의 변수 공유하기 /스태틱변수는 스태틱 문법끼리 공유할 수 있다. 

공통적으로 쓰이는 변수는 static으로 정의해놓으면 모든 static 변수들끼리 공유할 수 있다. 

아래와 같이 static으로 바깥에 빼기