오늘 알게 된 걸, 별다른 학습없이 머릿속에서 끄집어 내서 정리한 글
String a = "a" + "b" + "c";
의 경우 String a = "abc";
으로 빌드 된 것을 확인할 수 있다.System.out.println("1"+"2"+b);
와 같이 변수가 들어갈 경우, StringBuilder 연산이 추가된다.System.out.println()
에서 문자열을 더할 때 string.concat()
을 이용했지만, 성능개선을 위해 이후 내부적으로 StringBuilder
를 이용하도록 변경됐다고 한다.+
연산을 수행하면, 이전 String 값과 init 그리고 StringBuilder
연산 마지막으로 toString() 연산까지 더해져 StringBuilder
보다 느린 것을 알 수 있다.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");
}
}
//
// 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;
}
정보처리기사때 봤던 1NF ~ BCNF 정규형, 정규화 당시에는 그냥 외워서 문제를 풀었었는데
오늘 수업을 들으면서 이해를 하려고 하니 생각보다 어려운 내용이 존재했다.
는 함수가 아니라고 한 부분에서 멘탈이 흔들리기 시작하면서, 뒷내용을 따라가기 약간 버거웠다.
지난 Join 수업을 낮잠을 자느라 못듣는 바람에 뒤쳐져서 수업 따라가기에 지장이 생긴 것 같다.
한번 놓치고 복습안하니까 정말 겉잡을 수 없는 것 같다.
더 늦기전에 이번주말에 몰아서 복습 시간을 가져야 할 것 같다.
지금 기억 나는 것
1NF : 원자값으로 만들기, 멀티 밸류 불가능
2NF: 기억 안남
3NF: 3단논법이 가능하면 안된다. EX) A→B , B→D , A→D
BCNF : 사이클이 생기면 안된다.
정규화를 하는 이유
인공키와 자연키
자연키의 경우 후보키를 통해 만드는 것
인공키는 JPA의 auto inclement와 같은 인공적으로 만드는 키를 말한다.
이 두 키중 뭐가 좋고 나쁘고를 가를 수 있는 것은 아니라고 한다. ( 항상 논쟁.. )