배움 __IL/TIL 1기

TIL : 12번째- 221214 [12-2-수]

Mo_bi!e 2022. 12. 14. 21:03

※ Keep in mind

 본 내용은 웹개발과정의 강의 중 내용을 복습을 위해서 메모한 것에 불과한 것입니다. 이러한 연유로 강의내용을 오인한 나머지 오기재 및 불기재가 있을 수 있으니 '참고'만 해주시길 바랍니다. 저의 경우에도 본 내용을 단순히 읽은 것이 결코 저의 것이라고 생각하지 않습니다. 본 내용은 복습를 위한 초기 내지 중간 과정에 불과한 것이고, 이후에 내용을 보충 후 인출 및 설명하기 과정이 있어야 비로소 복습의 단추가 어느정도 마무리 되어간다고 볼 수 있습니다.

 따라서 당초에 본 내용은 비공개였습니다. 그럼에도 불구하고 본 내용을 공개한 점은 함께 공부하는 동료들과 나눔을 바탕으로 배움과 성장의 공진화라는 소기의 목적을 달성에 어느정도 도움이 될수 있기 때문이라고 생각합니다.

 

I. INTRO : 오전 일일문제

- 오목 관련 코드리뷰

1. 조건문 () 조건은 최대한 간략하게 하기

2. 두개의 동일한 내용 중복 안됨

 

II. 배열

1. 정렬

(1) 버블정렬

옆과 싸우기

 

(2) 선택정렬

왕으로 당신을 선택합니다. 왕좌에 나와있는 것으로 싸우고 겨룬다.

 

(3) 퀵정렬

토너먼트 처럼 나와서 올라가는 것임

 

2. 버블정렬

n - 1 번 반복해야한다.

왜냐하면 비교는 숫자의 갯수 - 1만큼 이기 때문에

for(int i = 0 ; i < 15 - 1 ; i ++) {

        //바꿀지 말지 조건 지정
        // i , i + 1번째일때 i 가 더 클때
        if(nums[i] > nums[ i + 1]) {

            int tmp1 = nums[i];
            nums[ i ] = nums[ ( i + 1)];
            nums[ (i + 1)] = tmp1;
        }

    }

위는 오름차순방식이기 때문에 if문 조건이 이렇게 된다.

결과로 가장 오른쪽에 큰 값이 하나만 나오게 된다

 

이렇게 하나씩 하기 위해서 이중반복문을 이용해서 반복해준다.

for(int j = 0 ; j < 15 - 2 ; j++)
    for(int i = 0  ; i < ((15 - 1) - j)  ; i ++) {

        //바꿀지 말지 조건 지정
        // i , i + 1번째일때 i 가 더 클때
        if(nums[i] > nums[ i + 1]) {

            int tmp1 = nums[i];
            nums[i] = nums[( i + 1)];
            nums[(i + 1)] = tmp1;
        }

    }

i의 조건절에 j로 빼가면서 우측 끝에서 한칸씩 인덱스가 빼져간다.

 

i의 종료절이 15 -1 인 이유는 15개의 숫자는 14번 비교하면 되기 때문이다.

여기서 j의 종료절이 15 - 2 인 이유는 안쪽 for문의 최초 한번반복에서 이미 가장 큰숫자가 우측 끝에 정렬되었고 더이상 그 위치는 관여할 필요가 없어진다.

또한 i 종료절 (15-1) - j 인 이유는 정렬이 끝난 부분은 더이상 관여할 필요가 없기 때문에 끝에서 부터 차례대로 관여할 부분을 줄여나가기 위해서이다.

 

실수로 당초에 i = j 로 했는데 좌측부터 정렬을 하려고 시도했기 때문이다.

이런 경우에는 if 조건문도 조건을 바꾸고 전체적으로 방향을 반대로 해야한다.

 

- 이러한 것들은 매번 외우기 힘들다. 한번 만들면 하나의 문장으로 쓸 수 있게 하기위해서 함수를 이용한다.

수학적인 알고리즘을 함수화 하면 인간적으로 된다. (마치 기계의 역할을 수학이 갈음하는 것 처럼)

 

3. 문자열 연산

1. String 객체가 제공하는 + 오버로드 연산자

- 객체란

자바에서 문자는 객체이다.

 

String s1 = "hello" [이렇게만 해도 객체이다]

String s2 = new String("hello");

위아래는 동일한 기능을 함 s1이 더 수월하다

하지만 s2의 경우를 살펴보면 결국 String은 객체를 선언하는 것이다.

String s1 = "hello";
String s2 = new String("hello");

실제로 s1, s2에대한 접근가능한 함수는 동일하다 (함수 == 객체를 이용하기 위한 도구)

함수가 가능하다는것은 도구화 되었다는 것을 의미한다.

(기능 == 문자 복사, 쪼개기, 대문자로 등)

 

-실제로 가장 많이쓰는 것은 문자열이다.

DB에서 꺼내 쓸 때에도 그러하다(이름,주소,학번) 모두 문자열이다.

숫자라고 해도 문자이다.

 

 

 

- 오버로드 + 연산자

 

String s1 = "hello";
String s2 = new String("hellO");

String s3 = s1 + s2;
System.out.println(s3);

우선 메소드 오버로딩이란 메소드가 서로 인수가 다른 경우에는 동일한 이름이라고 하더라도 메소드를 만들 수 있다.

연산자 오버로딩이란 연산자(+ -)의 기능이 있음에도 인수가 다른 경우에 연산자의 직관적인 의미를 활용해서 복잡한 피연산자에 활용을 가능하게끔 할 수있다.

 

이 경우 자바에서는 String 간의 + 연산자를 이용해서 문자열을 합칠 수 있다.

 

2. 문자열과 값 사이의 변환 (반드시 암기)

// 1번 정수를 문자열로 변환
	int n = 3;
    //int s = n //(불가)
    
// 아래의 경우 정수를 스트링으로 변환시켜준 후 리턴한다.
    String s = Integer.toString(n);
    String s = String.valueOf(n);
    //위 두개는 기능이 거의 동일함

// 2번 문자열을 정수로 변환
    String s = "35";
//  int n = s; //(불가)
    
    int x = Integer.parseInt(s);

이 경우 값과 XX를 구분 해주어야한다.

 

String.valueOf(정수), Integer.toString(정수) 모두 정수를 문자열로 바꾸어 리턴한다.

문자열을 정수로 바꾸려면 다음과 같이 Integer 클래스를 사용한다.

3. 연습 : 문자열 비교

String name1 = "아이유";
String name2 = "아이유";
String name3 = new String("아이유");

System.out.println(name1 == name2);
System.out.println(name1 == name3);
System.out.println(name1.equals(name3));

콘솔 : true false true

여기서 name1 과 name2는 JVM에 있는 string constant pool에 동일한 내용이 저장되어있다 (리터럴) 그러므로 true

그러나 name1,2와 달리 name3은 별도의 새로운 객체를 선언했기 때문에 String pool이 아니라 별도의 위치에 있다.

따라서 이경우 비교를 하면 false 이다.

 

 

문자열은 도구다 / 도구는 new할필요없이 하지만 이것은 도구화된 녀석이다.

쪼개기 / 대소문자 바꾸기 / split


1. 보충

(1) 버블정렬 이중for문 할때 조건관계 꼬임

어디 방향으로 먼저 오름차순의 숫자를 둘것인지에 대해서 반대로 이해했기 때문

그리고 관여할 부분을 줄여나가기 위해서 j를 잘 통제해야한다.

 

(2) 정렬의 내,오름차순에 대한 조건 명확히

if문을 할 때 유의해야한다.

 

(3) String 선언에 대한 방식의 차이

String a 와 String A = new String

은 String constant pool 에 있는지 여부로 달라진다.

그리고 이는 객체를 선언했는지 여부로도 볼 수있다. 

 

(4) char 와의 차이

char의 배열인점, 함수를 이용가능한 점

정확하지 않고 이해하는 취지에서 정리를 하면

char []A == String A
char [][]A == String []A

엄밀하게 보면 다른 것이지만 (왜냐하면 함수 기능차이, 자체적으로 자료형 여부) 이렇게도 이해할 수있다.

 

(5) 궁금증

-정말로 특정 클래스대한 인스턴스를 선언하면 별도의 메소드나 변수를 호출하기 전까지는 메모리를 차지하지않는것인가?

-정수형 변수의 값과 ~~대한?이라고 들었는데 정확한 파악이 필요하다.

 

2. 회고 

1) 제어구조의 ()안 조건문은 최대한 간단하게 해아한다.

 

2) 버블정렬을 이용할 때 이중for문은 생각을 하면서 접근 해야한다.

 

3) String 과 new String 의 차이에 대해서 깨닫게 되었다. 결국 자바의 heap 구조에 대해서도 궁금증이 생겨났다.

'배움 __IL > TIL 1기' 카테고리의 다른 글

TIL : 14번째- 221216 [12-2-금]  (2) 2022.12.16
TIL : 13번째- 221215 [12-2-목]  (0) 2022.12.15
TIL : 11번째- 221213 [12-2-화]  (0) 2022.12.13
TIL : 10번째- 221212 [12-2-월]  (1) 2022.12.12
TIL : 9번째- 221209 [12-1-금]  (0) 2022.12.09