[2021-04-01 목] TIL

노을·2021년 4월 3일
0

TIL

목록 보기
65/81

String은 느리다?


오늘 알게 된 걸, 별다른 학습없이 머릿속에서 끄집어 내서 정리한 글

  • 잘못된 내용이 다수 있을 수 있음.
  • 나중에 추후 학습
  1. String이 StringBuilder보다 무조건 느린게 아니라, 초기 값에 + 연산을 해줄 경우 오히려 더빠르다.
    1. 밑 class 파일과 바이트 코드를 확인해보자.
    2. String a = "a" + "b" + "c"; 의 경우 String a = "abc"; 으로 빌드 된 것을 확인할 수 있다.
      • 하지만 System.out.println("1"+"2"+b); 와 같이 변수가 들어갈 경우, StringBuilder 연산이 추가된다.
  2. java 1.5? 이하에서는 System.out.println() 에서 문자열을 더할 때 string.concat()을 이용했지만, 성능개선을 위해 이후 내부적으로 StringBuilder를 이용하도록 변경됐다고 한다.
  3. 하지만 for문내에 String의 + 연산을 수행하면, 이전 String 값과 init 그리고 StringBuilder 연산 마지막으로 toString() 연산까지 더해져 StringBuilder보다 느린 것을 알 수 있다.

StringTest.java

package webserver;

import org.junit.jupiter.api.Test;

public class StringTest {
    @Test
    void test() {
        String a = "a" + "b" + "c";

        a += "d";

        StringBuilder sb = new StringBuilder().append("1").append("2");

        sb.append("3").append("4");

        System.out.println(new StringBuilder().append("test").append("test").toString());

        String b = "test";

        System.out.println("1"+"2"+b);

        System.out.println("test2"+"Test");
    }
}

StringTest.class

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package webserver;

import org.junit.jupiter.api.Test;

public class StringTest {
    public StringTest() {
    }

    @Test
    void test() {
        String a = "abc";
        a = a + "d";
        StringBuilder sb = (new StringBuilder()).append("1").append("2");
        sb.append("3").append("4");
        System.out.println("test" + "test");
        String b = "test";
        System.out.println("12" + b);
        System.out.println("test2Test");
    }
}

바이트 코드

javap -c -l StringTest.class

Compiled from "StringTest.java"
public class webserver.StringTest {
  public webserver.StringTest();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return
    LineNumberTable:
      line 5: 0
    LocalVariableTable:
      Start  Length  Slot  Name   Signature
          0       5     0  this   Lwebserver/StringTest;

  void test();
    Code:
       0: ldc           #2                  // String abc
       2: astore_1
       3: new           #3                  // class java/lang/StringBuilder
       6: dup
       7: invokespecial #4                  // Method java/lang/StringBuilder."<init>":()V
      10: aload_1
      11: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      14: ldc           #6                  // String d
      16: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      19: invokevirtual #7                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      22: astore_1
      23: new           #3                  // class java/lang/StringBuilder
      26: dup
      27: invokespecial #4                  // Method java/lang/StringBuilder."<init>":()V
      30: ldc           #8                  // String 1
      32: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      35: ldc           #9                  // String 2
      37: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      40: astore_2
      41: aload_2
      42: ldc           #10                 // String 3
      44: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      47: ldc           #11                 // String 4
      49: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      52: pop
      53: getstatic     #12                 // Field java/lang/System.out:Ljava/io/PrintStream;
      56: new           #3                  // class java/lang/StringBuilder
      59: dup
      60: invokespecial #4                  // Method java/lang/StringBuilder."<init>":()V
      63: ldc           #13                 // String test
      65: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      68: ldc           #13                 // String test
      70: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      73: invokevirtual #7                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      76: invokevirtual #14                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      79: ldc           #13                 // String test
      81: astore_3
      82: getstatic     #12                 // Field java/lang/System.out:Ljava/io/PrintStream;
      85: new           #3                  // class java/lang/StringBuilder
      88: dup
      89: invokespecial #4                  // Method java/lang/StringBuilder."<init>":()V
      92: ldc           #15                 // String 12
      94: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      97: aload_3
      98: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
     101: invokevirtual #7                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
     104: invokevirtual #14                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
     107: getstatic     #12                 // Field java/lang/System.out:Ljava/io/PrintStream;
     110: ldc           #16                 // String test2Test
     112: invokevirtual #14                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
     115: return
    LineNumberTable:
      line 8: 0
      line 10: 3
      line 12: 23
      line 14: 41
      line 16: 53
      line 18: 79
      line 20: 82
      line 22: 107
      line 23: 115
    LocalVariableTable:
      Start  Length  Slot  Name   Signature
          0     116     0  this   Lwebserver/StringTest;
          3     113     1     a   Ljava/lang/String;
         41      75     2    sb   Ljava/lang/StringBuilder;
         82      34     3     b   Ljava/lang/String;
}

데이터베이스 정규화


10일차

정보처리기사때 봤던 1NF ~ BCNF 정규형, 정규화 당시에는 그냥 외워서 문제를 풀었었는데

오늘 수업을 들으면서 이해를 하려고 하니 생각보다 어려운 내용이 존재했다.

x2=yx^2 = y 는 함수가 아니라고 한 부분에서 멘탈이 흔들리기 시작하면서, 뒷내용을 따라가기 약간 버거웠다.

지난 Join 수업을 낮잠을 자느라 못듣는 바람에 뒤쳐져서 수업 따라가기에 지장이 생긴 것 같다.

한번 놓치고 복습안하니까 정말 겉잡을 수 없는 것 같다.

더 늦기전에 이번주말에 몰아서 복습 시간을 가져야 할 것 같다.

지금 기억 나는 것

1NF : 원자값으로 만들기, 멀티 밸류 불가능

2NF: 기억 안남

3NF: 3단논법이 가능하면 안된다. EX) A→B , B→D , A→D

BCNF : 사이클이 생기면 안된다.

정규화를 하는 이유

  • 중복을 제거하고, sql??.. 뭐였더라...

인공키와 자연키

자연키의 경우 후보키를 통해 만드는 것

인공키는 JPA의 auto inclement와 같은 인공적으로 만드는 키를 말한다.

이 두 키중 뭐가 좋고 나쁘고를 가를 수 있는 것은 아니라고 한다. ( 항상 논쟁.. )

profile
카르페디엠

0개의 댓글