SyntaxHighlighter.all(); 게을러지고 싶어 부지런한 개발자 :: 게을러지고 싶어 부지런한 개발자

Builder

개발하면서 가장 귀찮은 것 중에 하나다 Builder를 만드는 것이다. 이것은 자바 모델과도 거의 비슷한것이 반복된 내용만 가득하고.. 사용하는건 정말 편하고 좋은데 Builder자체를 만드는것은 귀찮은 일이다. Lombok 어노테이션을 사용하면 Builder도 자동으로 만들 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package myFirstGradleProject;
 
import lombok.*;
 
 
@RequiredArgsConstructor
@Getter @Setter
@Builder
public class Customer {
    @NonNull private String name;
    private Integer age;
    @NonNull private Date dateOfBirth;
    private String gender;
    private Integer height;
}
 
 
 

이제 Builder를 사용해 오브젝트를 생성 해 보자.

 

1
2
3
4
5
6
7
8
Customer c = Customer.builder()
.name("f.softwareengineer")
.age(78)
.dateOfBirth(new Date())
.gender("female")
.height(188)
.build();
System.out.println(c.getName());
cs

 

만약 @Builder 어노테이션이 없었다면 코드의 양은 이렇다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package myFirstGradleProject;
 
import lombok.*;
 
 
@RequiredArgsConstructor
@Getter @Setter
public class Customer {
 
@NonNull private String name;
private Integer age;
 
@NonNull private Date dateOfBirth;
private String gender;
 
private Integer height;
 
public static class builder {
private String name;
private Integer age;
private Date dateOfBirth;
private String gender;
private Integer height;
 
public builder() {
 
}
 
public builder name(String name) {
this.name = name;
return this;
}
 
public builder age(Integer age) {
this.age = age;
return this;
}
 
public builder dateOfBirth(Date dateOfBirth) {
this.dateOfBirth = dateOfBirth;
return this;
}
 
public builder gender(String gender) {
this.gender = gender;
return this;
}
 
public builder height(Integer height) {
this.height = height;
return this;
}
 
public Customer build() {
Customer c = new Customer(this.name, this.dateOfBirth);
c.age = this.age;
c.gender = this.gender;
c.height = this.height;
return c;
}
 
}
}
cs

 

여기다가 생성자와 게터 세터까지 추가하면 boilerplate 코드만 백줄이 넘는 것이다..

Editing
Shift + shift 모든검색
Ctrl + N 파일 검색(파일이름:줄번호 시 해당줄번호로 이동 및 포커스)
Ctrl + shift + N 파일검색
Ctrl + E 이전오픈파일
Ctrl + shift + E 최근수정파일
Ctrl + Shift + A 모든기능 퀵 검색
Ctrl + F 파일내에서 단어 찾기
Ctrl + shift + F 모든파일에서 단어 찾기
- Ctrl + shift + R 모든파일에서 단어 변경
Ctrl + F12 소스트리 구조
Ctrl + shift + alt + J 파일내 동일단어 한번에 수정
Ctrl + W 블록범위가 점점커짐

Ctrl + T git pull
Ctrl + K git commit
Ctrl + shift + K git push

Alt + 1 project 포커스 이동 (editor 창이 아닌데서 ESC시 editor로 포커스 이동)
Shift + ESC view hide
Shift + F6 파일이름변경
Ctrl + Shift + 방향키 editor창이 아닌 뷰의 경우 사이즈 조절
Ctrl + shift + F12 editor 전체화면

Alt + shift + insert 세로편집
Tab 들여쓰기
Shift + tab 들여쓰기 반대
Ctrl + Y 줄삭제
Ctrl + X 잘라내기
Ctrl + shift + 위,아래 줄이동
Ctrl + shift + U 영어 대소문자 토글
Ctrl + D 줄복사
Ctrl + space 코드어시던트
Ctrl + shift + V 복사ctrl+C 히스토리중 선택 붙여넣기
Ctrl + Z 이전 undo
Ctrl + shift + Z 앞전? Redo
Ctrl + alt + L 전체 코드 재정렬

Complie and Run
Ctrl + F2 서버 종료
Shift + F10 서버시작

Java
Ctrl + alt + O 정리 import
Ctrl + O 오버라이드(Override)
Alt + Enter 자동 import
Alt + Insert 일반적코드 자동생성목록(생성자, getter,setter, toString)

mybatis를 공부하다 보니 아래와 같은 설명이 있다.

 

마이바티스는 개발자가 지정한 SQL, 저장프로시저 그리고 몇가지 고급 매핑을 지원하는 퍼시스턴스 프레임워크

 

퍼시스턴스(Persitence)

퍼시스턴스는 데이터의 지속성을 의미. 즉 애플리케이션을 종료하고 다시 실행하더라도 이전에 저장한 데이터를 다시 불러올수있는 기술.

 

 

프레임워크(Framework)

라이브러리가(library)가 개발에 필요한 도구들을 단순히 나열해 놓은 것이라면 프레임워크(framework)는 동작에 필요한 구조를 어느 정도 완성해 놓은 반제품 형태의 도구입니다.

 

 

퍼시스턴스 프레임워크

퍼시스턴스 프레이임워크는 데이터의 저장, 조회, 변경, 삭제를 다루는 클래스 및 설정 파일들의 집합

퍼시턴스 프레임워크를 사용하면 JDBC프로그래밍의 복잡함이나 번거로움 없이 간단한 작업만으로 데이터베이스와 연동되는 시스템을 빠르게 개발할 수 있습니다. 안정적인 구동도 보장.

 

 

퍼시스턴스 프레임워크 종류

- SQL문장으로 직접 DB데이터를 다루는 'SQL 맵퍼(mapper)' : mybatis

- 자바 객체를 통해 간접적으로 DB데이터를 다루는 '객체 관계 맵퍼(Object-Relational mapper)' : 하이버네이트(Hibernate)

 

 이 문제는

B문자열을 하나씩 A문자열만큼 돌면서 A문자열과의 차이가 가장 적을 때 그 차이를 출력하면 되는 문제이다.

 

A = aaa

B = bbaaabb

일 때

i = 0 -> aaa, bba -> 2

i = 1 -> aaa, baa -> 1

i = 2 -> aaa, aaa -> 0

. . .

이런 식으로 A문자열과 B의 부분 문자열 가장 차이가 적을 때를 찾으면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 
// adaabc aababbc
public class b1120_문자열 {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        String A = st.nextToken();
        String B = st.nextToken();
        
        int ans = A.length();
        
        for(int i=0; i<=B.length()-A.length(); i++) {  // i=0, i=1까지 
            int cnt = 0;
            for(int j=0; j<A.length(); j++) {
                if(A.charAt(j) != B.charAt(i+j)) {
                    cnt++;
                }
            }
            ans = Math.min(ans, cnt);
        }
        
        System.out.println(ans);
    }
}

Strinig to int

String str= "123";

int n = Integer.parseInt(str);

 

int to String

int n= 123;

String str = Integer.toString(n);

 




여기서 기본적으로 4가지 아스키 코드를 외우고있으면 활용하실때 편합니다.

Enter = 13,    숫자 0 = 48,     대문자 A = 65 ,     소문자 a = 97

​이 4가지는 꼭 외우고 있도록 합시다.

 

 

방법 1)

char a = 'A';

int result = a;   // char는 바로 int로 집어넣어 형변환

System.out.println(a); 

 

방법 2)

String a = "A";

int result= a.charAt(0);  // String은 charAt()메소드 사용하여 int로 

System.out.println(a); 

 

=====================

반대로 10진수에서 아스키코드로 변환하는 방법은?

int n = 65;

System.out.println((char)n);    // 출력결과 : A 

 

 

정렬 시간복잡도

 

 Call by value, Call by reference ?

 

 위 두 내용은 메소드(함수)에서 인자값을 받을 때 어떤식으로 받아 올 것 인지에 대한 방식이다.

 뜻 그대로 '값에 의한 호출' 그리고 '참조에 의한 호출' 인데 그 내용은 예시를 들어 설명해보겠다.

 

 

 Call by value

메소드 호출 시에 사용되는 인자의 메모리에 저장되어 있는 값(value)을 복사하여 보낸다.

무슨 뜻이냐면 int a =3 이라는 문구가 있으면 

메소드에서 인자값을 받을 때 a라는 자체에 주소를 받는게 아니라 a의 값인 3을 받아 처리하는 방식이다.

 

 

 Call by reference

메소드 호출 시 사용되는 인자 값의 메모리에 저장되어있는 주소(Address)를 복사하여 보낸다.

값이 아니라 인자 그자체에 주소 값을 보낸다. 

 

 

 

결론을 먼저 말하자면 자바는 Call by value  방식으로 인자값을 받는다.

 

결과 값은 이렇다

비포

안녕잘가

에프터

안녕잘가

 

 왜 스왑 메소드를 이용해서 서로를 바꿔준 것 같지만 바뀌지 않았을까?? Call by value 방식이기 때문이다. 

스왑 메소드가 받는 두 인자는 인자값에 주소, 즉 인자 그자체를 받는 것이 아니라 인자의 값을 복사해서 받는다.

즉 String one 에는 a에 값인 "안녕" 에 값이 (String 은 참조 변수 이므로 "안녕" 에 주소 값이 복사)

마찬가지로 two 에도 b의 주소가아닌 b값에 주소가 복사 되어진다.

 

 

 

 이렇게 메인 메소드의 a, b와 swapS 메소드의 one two는 서로 같은 값을 참조할 뿐 이다.

 이렇게 메소드 내에서는 변화가 이루어 지지만 메소드가 닫히면 swapS에 있던 정보는 다 사라지므로 메인 메소드에 영향을 주지 못한다.

만약 위 코드에 있는 //주석문을 활성화 시키면 바뀐 값을 출력 할 것이다.

 

 

 만약 call by Reference 방식 이였으면 메소드내에서 one two가 a, b의 주소값을 받아 곧 a=one b=two 이고 메소드 수행으로 서로값이 바뀌니 메소드 수행을 하고 나서도 a, b가 바뀌어 있을 것이다. 

 

 

하지만 이러한 효과를 내는 방법은 있다.

 

 

 

 

swap() 호출 전 : a = 10, b = 20

swap() 호출 전 : a = 20, b = 10

 

이렇게 값이 바뀌는 걸 볼 수 있다.

 

그림으로 보자

 

마찬가지로 one과 two는 값의 주소를(call by value) 복사받아 같은 인스턴스를 참조하는 것 이지만..

 

 

이렇게 참조 되어지는 값을 바꾸어 주어 마치 call by reference 가 이루어진 것 처럼 보인다.

 

비슷한 예로 

 

1 8

8 1

 

이렇게 가르키고 있는 공간의 값을 바꾸어 주면 된다.

 

 

 

정리하자면 !!

자바는 !

기본형 타입 변수와 참조형 타입 변수가 있는데 

둘 다! 상관없이 call by value 방식으로 메소드에서 받아진다 !

 

대신 기본형 타입은 그 값을 복사 해서 주지만

참조형 타입은 값의 래퍼런스(주소)가 저장되는 것이므로 그 값의  래퍼런스가 복사 되어진다 !

 

즉 값의 래퍼런스가 call by value 방식으로 넘어간다!.

 

말이 긴데 어찌되었든 call by value 방식이다 자바는..

 

 

 

참고

https://sleepyeyes.tistory.com/11

+ Recent posts