# data[].attributes.attachment_link.title
코딩 잘하는 팁 세가지 (이걸 알면 코드가 깔끔해 진다)

# data[].attributes.body
아침엔 졸리다

# data[].attributes.body
자바

# data[].attributes.body
자바공부

# data[].attributes.body
조건문
주어진 조건을 비교 판단하여 조건에 만족할 경우 지정된 명령을 실행하고, 만족하지 않을 경우 다음단계의 명령을 수행하도록 하는 제어문.(프로그램 수행 흐름을 바꾸기위해 사용)
조건의 참, 거짓에 따라 서로 다른 작업을 수행한다.

단순 if문
if-else문
다중 if-else문
switch문

반복문
반복문은 코드를 반복적으로 실행하고자 할 때 사용한다.

for문 (반복 횟수를 알고 있을 때)
while문 (조건에 따라 반복할 때)
do-while문
**while문은 조건을 먼저 확인하고 반복수행을 하는 반면, do-while은 조건과 상관없이 수행을 한 번 한 후에 조건을 확인
조건에 맞지 않으면 더 이상 수행하지 않음

# data[].attributes.body
반복문 : 조건식에 의해 명령을 반복적으로 실행
for문은 반복의 횟수가 정해져 있는 경우,
while문은 반복의 횟수가 정해져 있지 않은 경우 사용

조건문:특정조건이 충족되면 실행되거나 그 반대로 충족되지 않으면 실행되는 문장

자바에서 충족되는 조건읜 if문이나else if문으로 충족되지 않은 경우는 else문으로 처리된다.

# data[].attributes.body
제어문에는 조건문과 반복문이 있다.

조건문: if문/ switch문

-> 제어문 블록을 빠져나와 정상 흐름(위에서 아래)으로 돌아온다.

if문의 종류 -> if문 , if-else문, 중첩 if문

if(조건식) {

실행문;

}

switch문 -> 변수가 어떤 값을 갖느냐에 따라 실행문 선택

반복문: for문 / while문 / do-while문

->제어문 블록을 빠져나와 처음으로 다시 되돌아가 실행한다

for문 ->for문 초기화식에서 선언된 변수는 for문 블록 내에서 사용하는 로컬변수이다. (for문 내에서만 사용가능)

while문 ->조건식이 true인 경우 계속해서 반복

do-while문->조건식에 의해 반복 실행된다는 점에서는 while문과 동일.

블록 내부의 실행문을 우선 실행시키고 실행결과에 따라 반복 실행을 계속할지 결정하는 경우 사용

# data[].attributes.body
아침엔 졸리다

# data[].attributes.body
제어문에는 조건문과 반복문이 있다.

조건문 : if문/switch문

주어진 조건을 비교 판단하여 조건에 만족할 경우 지정된 명령을 실행하고, 만족하지 않을 경우 다음단계의 명령을 수행하도록 하는 제어문.(프로그램 수행 흐름을 바꾸기위해 사용)
조건의 참, 거짓에 따라 서로 다른 작업을 수행한다.

if문의 종류 ->
단순 if문
if-else문
다중 if-else문
중첩 if문

switch문 ->
변수가 어떤 값을 갖느냐에 따라 실행문 선택

반복문의 종류->
for문 / while문/ do-while문

반복문은 코드를 반복적으로 실행하고자 할 때 사용한다.

for문 (반복 횟수를 알고 있을 때)
-> // 초기화식에서 선언된 변수는 for문 블록 내에서 사용하는 로컬변수이다. (for문 내에서만 사용가능)

while문 (조건에 따라 반복할 때)

do-while문
조건식에 의해 반복 실행된다는 점에서는 while문과 동일.

**while문은 조건을 먼저 확인하고 반복수행을 하는 반면, do-while은 조건과 상관없이 수행을 한 번 한 후에 조건을 확인
조건에 맞지 않으면 더 이상 수행하지 않음

# data[].attributes.body
switch case문이 좀더 효율적입니다.

-일반적으로 if-else문이 3개까지 일때(경우의 수가 적을때)는

if-else가 유리하지만,

그 이상이 될 때는 switch case문의 처리속도가 빠릅니다

# data[].attributes.body
가독성면에서는 switch case 문이 더 나음

if-else문은 앞의 if문을 다 확인해야하기 때문

일반적으로 3개 이하의 if문이 있으면 if-else문의 처리속도가 빠른데,

그 이상의 if문이 있다면 switch case문의 처리속도가 빠르다.

//시간복잡도 -> 최악의 조건으로 산출

# data[].attributes.headline
클래스의 구성요소와 생성자

# data[].attributes.subject
클래스의 구성요소와 생성자

# data[].attributes.body
클래스의 내부 구성요소는 필드,메서드,생성자로 구성이 됩니다.

필드는 클래스의 속성을 나타내는 변수로 객체의 속성값을 지정할 수 있습니다.

필드 선언은 생성자 선언과 메소드 선언의 앞,뒤 어디서든 가능합니다. 하지만 생성자와 메소드 중괄호 블록 내부에는 선언될 수 없습니다.

초깃값이 지정되지 않은 필드들은 객체 생성 시 자동으로 기본 초기값으로 설정됩니다.

메서드는 클래스가 지니고 있는 기능을 나타냅니다.

접근제어자 리턴형타입 메서드명(입력 매개변수) {

메서드 내용

}으로 구성이 됩니다.

리턴형타입은 메서드의 종료 이후 반환되는 값의 자료형을 의미합니다.

리턴형이 void가 아닐때 메서드 안에는 반드시 return 리턴값의 코드가 있어야 합니다.

리턴타입이 void일 때 return 은 메서드를 종료하라는 의미입니다.

메서드 호출)

클래스 외부에서 메서드 호출

-클래스 외부에서 메서드를 사용하려면 객체를 생성해야합니다

클래스 내부에서 메서드 호출

클래스 내부에 있는 메서드끼리는 객체를 생성하지 않고 서로를 호출할 수 있습니다.

생성자 -> 클래스의 객체를 생성하는 역할을 담당하고, 객체 내에 포함되는 필드의 초기화는 주로 생성자 내에서 수행합니다.

생성자를 포함하지 않는 클래스에서는 컴파일러가 기본생성자를 자동으로 추가해줍니다.

객체를 초기화하는 방법이 여러개 존재할 겨우 하나의 클래스가 여러개의 생성자를 가질 수 있습니다.

생성자도 하나의 메서드이므로 메서드 오버로딩이 가능.

# data[].attributes.body
생성자(Constructor)는

객체가 생성될때 자동으로 호출되는 특수 목적의 멤버함수(메소드)로 객체의 초기화를 위해 사용됩니다.

클래스이름(){}

생성자의 특징 :

생성자의 이름은 클래스 이름과 동일해야 합니다.

생성자는 다른 멤버함수(메소드)와는 다르게 리턴 타입이 없습니다.

생성자는 객체가 생성될때 자동으로 한번 호출됩니다.

생성자는 매개변수 조건에 따라 여러개를 작성할 수 있습니다. (오버로딩)

오버로딩(Overloading)

한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메소드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메소드를 정의할 수 있다.

조건:

메소드의 이름이 같아야한다.

매개변수의 개수나 타입이 달라야 한다.

'리턴 값만' 다른 것은 오버로딩을 할 수 없다.

오버로딩을 사용하는 이유 :

같은 기능을 하는 메소드를 하나의 이름으로 사용할 수 있다.

# data[].attributes.body
필드 (Field)

필드는 객체가 만들어질 때 그 객체의 특징적인 속성을 정의하는 공간이다.

필드의 초기값은 필드선언 시 주어질수도 있고 , 생략될수도 있다. 초기값이 지정되지 않은 필드들은 객체 생성 시 자동으로 기본 초기값으로 설정된다.

필드에서 다루는 변수는 클래스 변수(cv)와 인스턴스 변수(iv)이다. 이 둘은 static 키워드를 통해 구분할 수 있다.

클래스 변수 : 필드 내에서 static 키워드와 함께 선언된 변수, static 변수 또는 공유 변수라고도 함

인스턴스 변수 : 필드 내에서 선언된 변수 (static 키워드 없음)

인스턴스 변수(iv)

클래스를 통해 생성된 객체가 가지는 속성을 저장하기 위한 변수이다.

new 생성자()를 통해 인스턴스가 생성될 때 만들어진다.

인스턴스를 생성한 뒤, ‘인스턴스명.인스턴스변수명’을 통해 사용할 수 있다.

인스턴스는 힙 메모리의 독립적인 공간에 저장되고, 동일한 클래스로부터 생성되었지만 객체의 고유한 개별성을 가진다.

인스턴스를 생성할 때 인스턴스 변수가 생성되고, 참조변수가 없는 경우엔 Garbage collector에 의해 자동으로 제거된다.

클래스 변수와 인스턴스 변수의 차이

- 인스턴스 변수는 인스턴스(객체)가 만들어질 때마다 생성되므로 만들어진 각각의 인스턴스(객체)마다 다른 값을 유지할 수 있지만,

클래스 변수는 모든 인스턴스(객체)가 하나의 저장 공간을 공유하므로 항상 공통된 값을 가집니다.

# data[].attributes.headline
클래스,인스턴스변수,오버로딩,생성자

# data[].attributes.subject
클래스,인스턴스변수,오버로딩,생성자

# data[].attributes.body
클래스의 구성요소

클래스의 내부 구성요소는 필드,메서드,생성자로 구성이 됩니다.

필드는 클래스의 속성을 나타내는 변수로 객체의 속성값을 지정할 수 있습니다.

필드 선언은 생성자 선언과 메소드 선언의 앞,뒤 어디서든 가능합니다. 하지만 생성자와 메소드 중괄호 블록 내부에는 선언될 수 없습니다.

초깃값이 지정되지 않은 필드들은 객체 생성 시 자동으로 기본 초기값으로 설정됩니다.

메서드는 클래스가 지니고 있는 기능을 나타냅니다.

접근제어자 리턴형타입 메서드명(입력 매개변수) {

메서드 내용

}으로 구성이 됩니다.

리턴형타입은 메서드의 종료 이후 반환되는 값의 자료형을 의미합니다.

리턴형이 void가 아닐때 메서드 안에는 반드시 return 리턴값의 코드가 있어야 합니다.

리턴타입이 void일 때 return 은 메서드를 종료하라는 의미입니다.

메서드 호출)

클래스 외부에서 메서드 호출

-클래스 외부에서 메서드를 사용하려면 객체를 생성해야합니다

클래스 내부에서 메서드 호출

클래스 내부에 있는 메서드끼리는 객체를 생성하지 않고 서로를 호출할 수 있습니다.

인스턴스 변수

필드 (Field)

필드는 객체가 만들어질 때 그 객체의 특징적인 속성을 정의하는 공간이다.

필드의 초기값은 필드선언 시 주어질수도 있고 , 생략될수도 있다. 초기값이 지정되지 않은 필드들은 객체 생성 시 자동으로 기본 초기값으로 설정된다.

필드에서 다루는 변수는 클래스 변수(cv)와 인스턴스 변수(iv)이다. 이 둘은 static 키워드를 통해 구분할 수 있다.

클래스 변수 : 필드 내에서 static 키워드와 함께 선언된 변수, static 변수 또는 공유 변수라고도 함

인스턴스 변수 : 필드 내에서 선언된 변수 (static 키워드 없음)

인스턴스 변수(iv)

클래스를 통해 생성된 객체가 가지는 속성을 저장하기 위한 변수이다.

new 생성자()를 통해 인스턴스가 생성될 때 만들어진다.

인스턴스를 생성한 뒤, ‘인스턴스명.인스턴스변수명’을 통해 사용할 수 있다.

인스턴스는 힙 메모리의 독립적인 공간에 저장되고, 동일한 클래스로부터 생성되었지만 객체의 고유한 개별성을 가진다.

인스턴스를 생성할 때 인스턴스 변수가 생성되고, 참조변수가 없는 경우엔 Garbage collector에 의해 자동으로 제거된다.

클래스 변수와 인스턴스 변수의 차이

- 인스턴스 변수는 인스턴스(객체)가 만들어질 때마다 생성되므로 만들어진 각각의 인스턴스(객체)마다 다른 값을 유지할 수 있지만,

클래스 변수는 모든 인스턴스(객체)가 하나의 저장 공간을 공유하므로 항상 공통된 값을 가집니다.

오버로딩(Overloading)

자바의 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메소드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메소드를 정의할 수 있다.

조건:

메소드의 이름이 같아야한다.

매개변수의 개수나 타입이 달라야 한다.

'리턴 값만' 다른 것은 오버로딩을 할 수 없다.

오버로딩을 사용하는 이유 :

같은 기능을 하는 메소드를 하나의 이름으로 사용할 수 있다.

생성자

생성자(Constructor)는

객체가 생성될때 자동으로 호출되는 특수 목적의 멤버함수(메소드)로 객체의 초기화를 위해 사용됩니다.

클래스이름(){}

생성자의 특징 :

생성자의 이름은 클래스 이름과 동일해야 합니다.

생성자는 다른 멤버함수(메소드)와는 다르게 리턴 타입이 없습니다.

생성자는 객체가 생성될때 자동으로 한번 호출됩니다.

생성자는 매개변수 조건에 따라 여러개를 작성할 수 있습니다. (오버로딩)

# data[].attributes.body
상속이란?

부모 클래스(상위 클래스)와 자식 클래스(하위 클래스)가 있으며, 자식 클래스는 부모 클래스를 선택해서, 그 부모의 멤버를 상속받아 그대로 쓸 수 있게 됩니다.

상속을 하는 이유?

이미 만들어져있는 클래스를 재사용해서 만들 수 있기 때문에 효율적이고, 개발 시간을 줄여주게 됩니다.

상속이 되지 않는 경우

부모 클래스의 private 접근 제한을 갖는 필드 및 메소드는 자식이 물려받을 수 없습니다.

부모와 자식 클래스가 서로 다른 패키지에 있다면, 부모의 default 접근 제한을 갖는 필드 및 메소드도 자식이 물려받을 수 없습니다.

(default 접근 제한은 ‘같은 패키지에 있는 클래스’만 접근이 가능하게끔 하는 접근 제한자이기 때문입니다.)

그 이외의 경우는 모두 상속의 대상이 됩니다.

클래스 상속

상속받고자 하는 자식 클래스명 옆에 extends 키워드를 붙이고, 상속할 부모 클래스명을 적습니다.

자바는 다중 상속을 허용하지 않으므로, extends 뒤에는 하나의 부모 클래스만 와야 합니다.

public Class Parent{ .... }; // 부모 클래스

public Class Child extends parent { .... }; // 자식 클래스

# data[].attributes.body
상속이란?

자바에서 상속은 한 클래스가 다른 클래스의 특성(필드 및 메서드)을 물려받아 사용할수 있도록 하는 매커니즘입니다.

부모 클래스의 필드와 메소드를 자식 클래스에서 사용할 수 있도록 합니다.

코드의 재사용성을 높이고 클래스 간의 관계를 명확하게 정의하여 코드를 구조화하고 유지보수하기 쉽게 만듭니다.

'extends' 키워드를 사용하여 표현됩니다.

class 자식클래스 extends 부모클래스 {

//필드

//생성자

//메소드

}

상속의 특징

1. 단일 상속(Single Inheritance):

한 클래스는 하나의 부모 클래스만 상속할 수 있습니다.

이는 클래스 간의 명확한 계층 구조를 형성하여 코드를 이해하고 유지보수하기 쉽게 합니다.

2. 부모 클래스에서 private 접근제한을 갖는 필드와 메소드는 상속 대상에서 제외됩니다. 그리고 부모 클래스와

자식 클래스가 다른 패키지에 존재한다면 dafault 접근 제한을 갖는 필드와 메소드도 상속 대상에서 제외됩니다.

3.부모 클래스의 생성자 호출:

자식 클래스의 생성자에서 super() 키워드를 사용하여 부모 클래스의 생성자를 명시적으로 호출할 수 있습니다.

부모 클래스의 생성자는 자식 클래스의 생성자가 호출될 때 자동으로 호출되며, 이를 통해 부모 클래스의 초기화 작업을 수행할 수 있습니다.

4.메서드 재정의(Overriding):

자식 클래스는 부모 클래스로부터 상속받은 메서드를 재정의할 수 있습니다.

이를 통해 자식 클래스는 부모 클래스의 동작을 수정하거나 확장할 수 있습니다.

메서드 재정의를 통해 다형성(polymorphism)을 구현할 수 있으며, 이는 객체 지향 프로그래밍의 중요한 특징 중 하나입니다.

-부모 메소드 호출

자식 클래스에서 부모 클래스의 메소드를 재정의하게 되면, 부모 클래스의 메소드는 숨겨지고 재정의된 자식 메소드만 사용됩니다.

그러나 자식 클래스 내부에서 재정의된 부모 클래스의 메소드를 호출해야 하는 상황이 발생한다면 명시적으로 super 키워드를 붙여서

부모 메소드를 호출할 수 있습니다.

super.부모메소드( );

5. final 클래스와 final 메소드

- 상속할 수 없는 final 클래스

클래스를 선언할 때 final 키워드를 class 앞에 붙이면 이 클래스는 최종적인 클래스이므로 상속할수 없는 클래스가 됩니다.

즉, final 클래스는 부모 클래스가 될 수 없어 자식 클래스를 만들 수 없다는 것입니다.

- 재정의할 수 없는 final 메소드

메소드를 선언할 때 final 키워드를 붙이면 이 메소드는 최종적인 메소드이므로 재정의할 수 없는 메소드가 됩니다.

즉, 부모 클래스를 상속해서 자식 클래스를 선언할 때 부모 클래스에 선언된 final 메소드는 자식 클래스에서 재정의 할 수 없다는 것입니다.

6.protected 접근 제어자 활용:

상속 관계에서 자식 클래스는 부모 클래스의 protected 멤버에 접근할 수 있습니다.

이는 부모 클래스의 내부 상태를 자식 클래스에서 조작하거나 사용할 수 있도록 합니다.

자바에서 상속을 추상클래스로 선언하는 방법

자바에서 상속을 추상 클래스로 선언하려면, 부모 클래스를 abstract 키워드로 선언해야 합니다.

또한, 추상 메서드를 포함할 수 있습니다.

추상 메서드는 하위 클래스에서 반드시 구현되어야 합니다.

# data[].attributes.body
Parent() call

Child() call

# data[].attributes.body
자바에서 콜렉션은

데이터를 저장하고 관리하기 위한 클래스들의 모음입니다. 데이터를 다양한 방식으로 저장하고 조작할 수 있는 유용한 인터페이스와 클래스를 제공하여 프로그래머가 효율적으로 데이터를 다룰 수 있도록 도와줍니다.

콜렉션 프레임워크에는 다음과 같은 주요 인터페이스와 클래스들이 포함되어 있습니다:

1. List 인터페이스:

- 순서가 있는 데이터의 모음을 표현합니다.

- 중복된 요소를 허용합니다.

- ArrayList, LinkedList, Vector 등이 List 인터페이스를 구현한 클래스들입니다.

ArrayList

List인터페이스의 구현체

내부적으로 배열을 사용하여 데이터를 저장하는 클래스.

데이터 접근 속도가 매우 빠르기 때문에 대용량 데이터 처리에 적합합니다.

LinkedList

List 인터페이스의 구현체

내부적으로 연결 리스트를 사용하여 데이터를 저장하는 클래스.

데이터 삽입/삭제 작업이 빈번하게 일어나는 경우에 적합합니다.

Vector

List 인터페이스의 구현체

ArrayList와 거의 동일하지만 동기화된 메서드를 제공합니다.

멀티스레드 환경에서 안전하게 사용할 수 있습니다.

2. Set 인터페이스:

- 순서가 없는 데이터의 모음을 표현합니다.

- 중복된 요소를 허용하지 않습니다.

- HashSet, TreeSet 등이 Set 인터페이스를 구현한 클래스들입니다.

HashSet

Set 인터페이스의 구현체

내부적으로 HashMap을 사용하여 데이터를 저장하는 클래스입니다.

TreeSet

Set 인터페이스의 구현체

내부적으로 TreeMap을 사용하여 데이터를 저장하는 클래스입니다.

데이터는 정렬된 상태로 저장됩니다.

3. Map 인터페이스:

- 키-값(key-value) 쌍의 데이터를 저장합니다.

- 키는 중복될 수 없으나, 값은 중복될 수 있습니다.

- HashMap, TreeMap, LinkedHashMap 등이 Map 인터페이스를 구현한 클래스들입니다.

HashMap

해시 테이블을 사용하여 Key-Value 쌍을 저장합니다.

일반적으로 가장 많이 사용되고 효율적으로 동작하기에 이를 사용하면 됩니다.

TreeMap

레드-블랙 트리를 사용하여 Key-Value 쌍을 저장합니다.

Key 값에 따라 정렬됩니다.

“데이터를 정렬된 순서로 저장”하고 싶다면 이를 사용하면 된다.

inkedHashMap

해시 테이블과 연결 리스트를 사용하여 Key-Value 쌍을 저장합니다. 삽입 순서대로 출력됩니다.

“입력한 순서대로 데이터를 저장”하고 싶다면 이를 사용하며 된다.

콜렉션의 장점은 다음과 같습니다:

- 유연성: 다양한 종류의 데이터를 저장하고 다룰 수 있습니다.

- 효율성: 내부적으로 데이터를 효율적으로 관리하여 빠른 검색 및 조작이 가능합니다.

- 안정성: 타입 안정성을 제공하여 컴파일 시점에서 오류를 잡을 수 있습니다.

- 간편성: 다양한 메서드를 제공하여 데이터를 쉽게 추가, 삭제, 검색할 수 있습니다.

# data[].attributes.body
Collection(컬렉션)

- Java에서 Collection(컬렉션)이란 데이터의 집합, 그룹을 의미합니다.

JCF(Java Collection Framework)는 다수의 데이터를 쉽고 효과적으로 처리할 수 있는

표준화된 방법을 제공하는 클래스의 집합을 의미합니다.

Collection 주요 인터페이스 차이점

- List: 순서가 있으며, 데이터(값) 중복 허용

- Set: 순서가 없으며, 데이터(값) 중복을 허용하지 않음

- Map: Key&Value 구조, Key는 중복을 허용하지 않으며, Value(값)는 중복을 허용

1. List

- 입력 순서를 유지하며, 데이터의 중복을 허용

- 인덱스를 통해 저장 데이터에 접근이 가능

List 인터페이스의 주요 구현체

- ArrayList

- 단반향 포인터 구조 데이터 순차적 접근(조회)가 빠름

- LinkedList

- 양방향 포인터 구조 데이터 삽입, 삭제가 빠름

2. Set

- 입력 순서를 유지하지 않으며, 데이터의 중복 허용하지 않음

- 데이터에 null 입력 가능하나, 한 번만 저장하고 중복 저장을 허용하지 않음

- 인덱스가 따로 존재하지 않기 때문에 Iterator(반복자)를 사용하여 조회

Set 인터페이스의 주요 구현체

- HashSet

- 입력 순서를 보장하지 않으며, 데이터의 중복을 허용하지 않음

- LinkedHashSet

- 입력 순서를 보장하며, 데이터의 중복을 허용하지 않음

- TreeSet

- (default) 입력한 데이터의 크기가 비교 가능한 경우 오름차순으로 정렬되며, 데이터의 중복을 허용하지 않음

- 입력하는 데이터가 사용자 정의 객체인 경우 Comparable을 구현하여, 정렬 기준 설정 가능

3. Map

- Key&Value 구조

- Key(키)는 입력 순서를 유지하지 않으며, 중복을 허용하지 않음, Value(값)는 중복을 허용

- 인덱스가 따로 존재하지 않기 때문에 Iterator를 사용하여 조회

Map 인터페이스의 주요 구현체

-HashMap

- Key(키)에 대한 입력 순서를 보장하지 않으며, 중복 Key(키)를 허용하지 않음

- LinkedHashMap

- Key(키)에 대한 입력 순서를 보장하며, 중복 Key(키)를 허용하지 않음

- TreeMap

- 레드-블랙 트리(Red-Black Tree)를 기반으로 Key&Value를 저장

- (default) 입력한 Key(키)데이터의 크기가 비교 가능한 경우 오름차순으로 정렬되며, 중복 Key(키)를 허용하지 않음

- 입력하는 데이터가 사용자 정의 객체인 경우 Comparable을 구현하여, 정렬 기준 설정 가능

# data[].attributes.body
https://gamma.app/docs/yfazk2ewzzgvbqt?following_id=l9gscp0ksc48lgx&follow_on_start=true

# data[].attributes.attachment_link.title
중첩클래스(아침엔 졸리다)

# data[].attributes.body
빌더 패턴(Builder Pattern)은

객체의 생성 과정을 단순화하고 유연하게 만드는 디자인 패턴 중 하나입니다. 이 패턴은 객체 생성에 필요한 매개변수를 받아들이고 객체를 구성하는 데 사용되는 빌더 클래스를 정의합니다. 빌더 클래스는 객체의 생성 및 설정에 대한 메서드를 제공하여 객체를 단계적으로 빌드할 수 있도록 합니다.

빌더 패턴의 장점

1. 매개변수의 순서와 개수에 대한 제약 완화

2. 가독성 향상

3. 불변 객체 생성 지원

4. 유연성

5. 객체 생성 단계 분리

6. 매개변수의 선택적 설정

Java에서 빌더 패턴은 주로 다음과 같은 상황에서 사용됩니다

많은 매개변수를 갖는 객체를 생성할 때

여러 객체 구성이 가능한 경우

객체 생성 과정을 단순화하고 가독성을 높이고자 할 때

# data[].attributes.body
빌더패턴

빌더 패턴(Builder Pattern)은 복잡한 객체의 생성 과정과 표현 방법을 분리하여 다양한 구성의 인스턴스를 만드는 생성 패턴이다.

생성자에 들어갈 매개 변수를 메서드로 하나하나 받아들이고 마지막에 통합 빌드해서 객체를 생성하는 방식이다.

이 패턴은 객체 생성 과정이 복잡하거나 매개변수가 많을 때 유용하며, 객체의 생성 및 초기화를 단순화하고 가독성을 향상시킵니다.

출처: https://inpa.tistory.com/entry/GOF-💠-빌더Builder-패턴-끝판왕-정리 [Inpa Dev 👨‍💻:티스토리]

빌더 패턴 구현 방법

1. 클래스 안에 static 멤버 클래스로 Builder 클래스를 만들어 줍니다.

2. Builder 클래스는 생성할 클래스의 멤버 필드를 똑같이 가집니다.

3. Builder 클래스의 선택 멤버 필드를 기본값으로 초기화합니다.

4. Builder 클래스에 필수 멤버 필드를 매개변수로 하는 생성자를 선언합니다.

5. 선택 매개변수의 값을 저장하고 Builder 객체를 반환하는 메서드를 만듭니다.

6. 생성할 클래스의 객체를 반환해주는 builder 메서드를 만듭니다.

7. 생성할 클래스의 생성자로 Builder 객체를 받는 생성자를 만듭니다.

장점

빌더패턴을 적용하면 다음과 같은 장점이 있다.

불필요한 생성자의 제거

데이터의 순서에 상관없이 객체생성 가능

명시적 선언으로 이해하기가 쉽고

각 인자가 어떤 의미인지 알기 쉽다.

setter메서드가 없으므로 변경 불가능한 객체를 만들수있다.

한번에 객체를 생성하므로 객체일관성이 깨지지 않는다.

build()함수가 null인지 체크해주므로 검증이 가능한다.

안그러면 set하지않은 객체에대해 get을 하게되는경우 nullPointerExcetpion발생 등등의 문제

출처: https://devjjsjjj.tistory.com/entry/빌더-패턴-Builder-Pattern-Builder [달리는 두딘:티스토리]

1. 가독성과 유연성

: 빌더 패턴을 사용하면 객체 생성 코드가 매우 가독성이 높아집니다.

각 속성을 설정하는 메서드 호출이 명시적으로 되어 있기 때문에 객체가 어떻게 초기화되는지 쉽게 이해할 수 있습니다.

또한, 객체를 생성하는 과정을 여러 단계로 나눌 수 있으므로 유연성이 높아집니다.

2. 매개변수의 선택적 사용

: 빌더 패턴을 사용하면 객체의 매개변수를 선택적으로 설정할 수 있습니다.

이는 객체가 여러 가지 다른 형태로 생성될 수 있음을 의미합니다.

생성자에 매개변수를 모두 전달해야 하는 경우에 비해 훨씬 유연합니다.

3. 불변성 보장

: 빌더 패턴을 사용하면 생성된 객체를 불변성(immutable)으로 만들 수 있습니다.

빌더가 객체를 생성하고 초기화하는 과정에서 필요한 값들을 설정하고,

객체를 생성한 후에는 해당 객체의 상태를 변경할 수 없게 됩니다.

이는 객체의 안정성을 높이고, 다중 스레드 환경에서 안전하게 사용할 수 있도록 합니다.

4. 자바빈즈 패턴과의 대안

: 자바빈즈 패턴은 기본 생성자를 사용하여 객체를 생성한 후, setter 메서드를 사용하여 각 속성을 설정하는 방식입니다.

이에 비해 빌더 패턴은 객체의 생성과 초기화를 한 번에 수행할 수 있으므로 객체의 일관성을 보다 쉽게 유지할 수 있습니다.

5. 중첩된 객체 생성

: 빌더 패턴은 중첩된 객체를 생성하는 데 특히 유용합니다.

예를 들어, 객체 A가 객체 B를 포함하고 있고, 객체 B가 또 다른 객체 C를 포함하고 있는 경우,

빌더 패턴을 사용하여 객체 A를 생성할 때 객체 B와 객체 C를 쉽게 구성할 수 있습니다.

이러한 장점들은 빌더 패턴을 사용하여 객체를 생성할 때 코드의 가독성과 유지보수성을 향상시킬 수 있도록 도와줍니다.

# data[].attributes.attachment_link.title
빌더패턴(아침엔졸리다)

# data[].attributes.body
쓰레드(Thread)란

쓰레드는 간단하게 하나의 프로세스에서 독립적으로 실행되는 하나의 일 또는 작업의 단위를 뜻합니다.

자바에서 흔히 사용하는 main() 내 실행문 또한 하나의 쓰레드이며

프로그램 실행 시 처음으로 실행되는 쓰레드이기 때문에 메인 쓰레드라고도 합니다.

장점

1. 쓰레드끼리 메모리를 공유함으로써 자원의 절약

2. 동시에 여러 작업이 가능

단점

1. 실행 단위가 많아질수록 코드가 난해해진다.

2. 예상치 못한 충돌로 인한 버그가 발생할 수 있다.

Thread 사용법

자바에서 쓰레드를 사용하기 위해서는 다음과 같이 2가지 방법이 존재합니다.

1. Thread 클래스 상속

2. Runnable 인터페이스 구현

Thread 클래스나 Runnable 인터페이스를 상속받은 클래스에서

run() 메소드를 오버라이딩해서 실행시킬 코드를 메소드 안에 작성한 후, start() 메소드로 쓰레드를 호출해줍니다.

일반적으로 다른 클래스를 상속받기 위해 Thread 클래스를 상속받기보단 Runnable 인터페이스를 구현합니다.

멀티쓰레드와 동기화(Synchronized)

자바에서 지원하는 Synchronized 키워드는 여러 개의 쓰레드가 하나의 자원을 사용하고자 할 때,

현재 데이터를 사용하는 해당 쓰레드를 제외하고 나머지 쓰레드들을 접근하지 못하게 막는 개념입니다.

멀티쓰레드 환경에서 서로 공유하고 수정할 수 있는 데이터가 동기화되지 않은 채

이리저리 사용되면 안정성과 신뢰성이 보장되지 않습니다.

이에 Synchronized 키워드를 통해 쓰레드 간 동기화를 시켜 데이터의 안정성을 보장합니다.

그러나 Synchronized 키워드를 남발하게 되면 오히려 프로그램의 성능 저하를 일으킬 수 있다고 하니 적절한 사용이 권장됩니다.

# data[].attributes.attachment_link.title
자바스레드(아침엔 졸리다)

# data[].attributes.body
예외처리방법 떠넘기기

예외주요사항과 처리방법

1. try, catch

예외가 발생했을때 우리는 try ... catch ... finally 라는 키워드로 예외를 처리할 수 있거나 메소드를 호출한 곳으로 던질 수 있습니다.

한 가지 중요한 점은 자바에서 모든 예외는 Exception이라는 클래스를 상속받습니다.

try 블록 : 이 블록에서 예외가 발생할만한 코드가 쓰여집니다.

catch (예외 종류) 블록 : 이 부분에서 예외가 발생되었을때 처리하는 동작을 명시합니다.

catch블록은 여러 개가 있을 수 있습니다. 맨 처음 catch 블록에서 잡히지 않는 예외라면 다음 catch의 예외를 검사합니다.

이때 상속관계에 있는 예외 중 부모가 위의 catch, 그리고 그 자식 예외 클래스가 아래의 catch로 놓일 순 없습니다.

finally 블록 : 여기서는 예외가 발생하건 발생하지 않건 공통으로 수행되어야할 코드가 쓰여집니다.

2. throws

임시 파일의 삭제 등 뒷정리 코드가 쓰입니다.

-----------------------------------

예외처리방법

예외 복구: 예외 상황을 파악하고 문제를 해결하여 정상 상태로 돌려놓는 방법입니다.

예외 회피: throws 키워드를 통해 직접 처리하지않고 호출한 쪽으로 던져 회피하는 방법입니다.

예외 전환: 회피와 비슷하게 메소드 밖으로 예외를 throw 하지만 그냥 던지지않고

적합한 의미를 가진 예외로 변경하여 던지는 것입니다.

-----------------------------------------

예외란

예외(Exception): 예외는 사용자의 잘못된 조작이나 개발자의 코딩 로직의 실수로 인해 발생하는 프로그램 오류를 뜻합니다.

예외는 예외처리 코드를 통해 프로그램을 종료하지않고 다시 정상 실행상태가 유지되도록 할 수 있습니다.

*예외(Exception)와 에러(Error)는 다르다

예외를 설명하기전에 우선 예외와 에러에 대해서 간단히 짚고 넘어가겠습니다.

우리는 보통 예외가 발생하면 에러가 발생했다고 생각합니다. 하지만 Java에서 예외와 에러는 엄연히 다른 개념입니다!

에러(Error):

에러는 자바 프로그램 밖에서 발생한 오류를 뜻합니다.

예시로 프로그램이 동작하는 서버 자체가 고장이 났다거나, OS에 비정상적인 상황이 발생해서

JVM이 제대로 실행될 수 없는 경우 등이 있습니다. 예시를 보면 아시겠지만 에러는 애플리케이션 내 코드로

해결할 수 없기에 복구가 불가능합니다.

예외(Exception):

예외는 사용자의 잘못된 조작이나 개발자의 코딩 로직의 실수로 인해 발생하는 프로그램 오류를 뜻합니다.

예외는 예외처리 코드를 통해 프로그램을 종료하지않고 다시 정상 실행상태가 유지되도록 할 수 있습니다.

*추가 차이: 에러(Error)는 프로세스에 영향을 주고, 예외(Exception)는 Thread에만 영향을 줍니다.

예외란 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류를 말한다. 예외가 발생되면 프로그램은 곧바로 종료된다는 점에서 에러와 동일하다.

그러나 예외는 예외처리(Exception Handling)을 통해 프로그램을 종료하지 않고 정상 실행 상태가 유지될 수 있도록 할 수 있다.

예외의 종류

일반 예외(Exception)

일반 예외는 컴파일 체크 예외라고도 하는데, 자바 소스를 컴파일하는 과정에서 예외 처리 코드가 필요한지 검사하기 때문이다.

만약 예외 처리 코드가 없다면 컴파일 오류가 발생하게 된다.

실행 예외(Runtime Exception)

컴파일하는 과정에서 예외 코드를 검사하지 않는 예외를 말한다.

컴파일 시 예외 처리를 확인하는 차이일 뿐, 두가지 예외 모두 예외 처리가 필요하다.

일반 예외와 실행 예외 클래스를 구별하는 방법은 일반 예외는 Exception을 상속받지만 RuntimeException을 상속받지 않는 클래스들입니다.

실행 예외는 다음과 같이 일반예외와 같이 Exception을 상속받지만 Exception을 상속받은 java.lang.RuntimeException의 상속받는 예외들을 실행 예외의 클래스들입니다.

https://dreamcoding.tistory.com/70

# data[].attributes.attachment_link.title
자바 제네릭(아침엔 졸리다)

# data[].attributes.headline
스트림(자바 8 이상)

# data[].attributes.subject
스트림(자바 8 이상)

# data[].attributes.headline
데이터베이스 (SQL)부분 미완성

# data[].attributes.subject
데이터베이스 (SQL)부분 미완성

# data[].attributes.attachment_link.description
디자인 전문가가 아니어도 무료 템플릿으로 손쉽게 원하는 디자인을 할 수 있어요.

# data[].attributes.attachment_link.title
정규표현식(아침엔 졸리다)

# data[].attributes.body
<footer id="footer">
        <h1>하단영역</h1>
        <div class="wrap">
            <nav id="footer-menu">
                <h1>푸터메뉴</h1>
                <div class="wrap">
                    <ul class="flex center">
                        <li><a href="#">회사소개</a></li>
                        <li><a href="#">이용약관</a></li>
                        <li><a href="#"><strong>개인정보처리방침</strong></a></li>
                        <li><a href="#"><strong>청소년보호정책</strong></a></li>
                        <li><a href="#">운영정책</a></li>
                        <li><a href="#">고객지원</a></li>
                        <li><a href="#">NC 프라이버시 센터</a></li>
                        <li><a href="#">게임 이용 등급</a></li>
                    </ul>
                </div>
            </nav>
            <section id="company">
                <h1>회사정보</h1>
                <div class="wrap">
                    <div class="info">
                        <dl class="flex center">
                            <dt>상호</dt>
                            <dd>(주)코딩그라운드</dd>
                            <dt>대표</dt>
                            <dd>이진웅</dd>
                            <dt>사업자등록번호</dt>
                            <dd>111-88-000000</dd>
                            <dt>통신판매업신고</dt>
                            <dd>제2024-서울노원-0510호</dd>
                            <dt>통신판매업신고</dt>
                            <dd>제2024-서울노원-0510호</dd>
                            <dt></dt>
                            <dd><a href="#">사업자정보확인</a></dd>
                        </dl>
                    </div>

                    <div class="contact">

                    </div>
                    <div class="copy">

                    </div>
                </div>
            </section>
            <section id="footer-logo">
                <h1>하단로고</h1>
                <div class="wrap"></div>
            </section>

        </div>
    </footer>
</body>

</html>

# data[].attributes.body
 <section id="company">
                <h1>회사정보</h1>
                <div class="wrap">
                    <div class="info">
                        <dl class="flex center">
                        <dt>상호</dt>
                        <dd>(주)코딩그라운드</dd>
                        <dt>대표</dt>
                        <dd>조재청</dd>
                        <dt>사업자등록번호</dt>
                        <dd>02-888-8888</dd>
                        <dt>통신판매업신고</dt>
                        <dd>제 2024-서울노원-0510호</dd>
                        <dt></dt>
                    </dl>
                    </div>

                        <div class="contact">

                        </div>
                        <div class="copy">

                        </div>
                </div>
            </section>

            <section id="footer-logo">
                <h1>하단로고</h1>
                <div class="wrap">

                </div>
            </section>
        </div>
    </footer>

</body>
</html>

# data[].attributes.body
  <main>
        <div class="wrap">
            <nav id="shortcut">
                <h1>숏컷 메뉴</h1>
                <div class="wrap view-size">
                    숏컷메뉴
                </div>
            </nav>
            <section id="card-section" class="bg-color">
                <h1>카드 섹션</h1>
                <div class="wrap view-size">
                    카드섹션
                </div>
            </section>
            <section id="etc-service">
                <h1>기타서비스</h1>
                <div class="wrap view-size">
                    기타서비스
                </div>
            </section>
        </div>
    </main>

# data[].attributes.headline
1.클라우드 컴퓨팅 개요클라

# data[].attributes.body
1.클라우드 컴퓨팅 개요

클라우드 컴퓨팅 정의

클라우드 컴퓨팅의 역사와 발전

클라우드 컴퓨팅의 주요 특징

클라우드 컴퓨팅 서비스 모델

SaaS (Software as a Service)

정의 및 예시

장단점

PaaS (Platform as a Service)

정의 및 예시

장단점

IaaS (Infrastructure as a Service)

정의 및 예시

장단점

-----------------------------------------------------------------------------

2.주요 클라우드 컴퓨팅 플랫폼

Amazon Web Services (AWS)

Microsoft Azure

Google Cloud Platform (GCP)

IBM Cloud

각 플랫폼의 주요 서비스와 특징 비교

클라우드 환경에서의 서버 운영 체제 선택 기준

클라우드 컴퓨팅 플랫폼과 서버 운영 체제의 호환성

-----------------------------------------------------------------------------

3.서버 운영 체제 개요

서버 운영 체제의 정의와 역할

서버 운영 체제의 중요성

주요 서버 운영 체제

리눅스 계열

Ubuntu Server

Red Hat Enterprise Linux (RHEL)

CentOS

Debian

윈도우 서버

Windows Server 2019/2022

Windows Server Essentials

유닉스 계열

IBM AIX

HP-UX

Solaris

BSD 계열

FreeBSD

OpenBSD

NetBSD

기타 운영 체제

macOS Server

z/OS

# data[].attributes.body
package com.green.web.ssh;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;

import org.mybatis.spring.SqlSessionFactoryBean;

import org.mybatis.spring.SqlSessionTemplate;

import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import com.jcraft.jsch.JSch;

import com.jcraft.jsch.JSchException;

import com.jcraft.jsch.Session;

import com.zaxxer.hikari.HikariConfig;

import com.zaxxer.hikari.HikariDataSource;

import lombok.extern.slf4j.Slf4j;

@Slf4j //Simple Logging Facade for Java : 이 클래스에서 log를 사용할께요

@Configuration

public class SSHTunnellingConfig {

@Bean

DataSource dataSource(SSHTunnellingProperties sshTunnellingProperties,

DataSourceProperties dataSourceProperties) throws JSchException {

JSch jsch=new JSch();

jsch.addIdentity(sshTunnellingProperties.getPrivateKey());

Session sshsession=jsch.getSession(

sshTunnellingProperties.getUsername(),

sshTunnellingProperties.getSshHost(),

sshTunnellingProperties.getSshPort());

sshsession.setConfig("StrictHostKeyChecking", "no");

//서버 측에 등록된 HOST가 아니어도 엄격하게 확인하지 않도록 한것

sshsession.connect();

log.info("ssh-tunnel(EC2) 접속완료!");

//정보수정

HikariConfig hikariConfig=new HikariConfig();

int localPort=sshsession.setPortForwardingL(

sshTunnellingProperties.getLocalPort(),

sshTunnellingProperties.getRdsHost(),

sshTunnellingProperties.getRdsPort());

hikariConfig.setJdbcUrl(dataSourceProperties.getUrl().replace("[LOCAL_PORT]", String.valueOf(localPort)));

hikariConfig.setDriverClassName(dataSourceProperties.getDriverClassName());

hikariConfig.setUsername(dataSourceProperties.getUsername());

hikariConfig.setPassword(dataSourceProperties.getPassword());

return new HikariDataSource(hikariConfig);

}

@Bean

SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {

SqlSessionFactoryBean factoryBean=new SqlSessionFactoryBean();

//1.datasource

factoryBean.setDataSource(dataSource);

return factoryBean.getObject();

}

SqlSessionTemplate sqlSessionTemplate(DataSource dataSource) throws Exception {

return new SqlSessionTemplate(sqlSessionFactory(dataSource));

}

}