[Java] 공통

# JDBC

- JDBC(Java-Database Connector)는 Java 언어를 이용하여 DBMS에 접속하고자 할 때 사용하는 Java에서 제시하는 표준이다. 이에, 각 DBMS 개발사(社)는 JDBC 표준에 맞게 각 Connector 의존성을 개발하여 배포하고 있다. (자주 사용하는 의존성 참고)
- `Connection`(`java.sql.Connection`) : Java 어플리케이션과 데이터베이스간의 연결을 제공하는 인터페이스이다. 직접 객체화하지 않고, 이가 구현하여야 하는 로직은 `Class.forName` 메서드를 활용하여 지정한 DBMS의 드라이버(Driver)에 따라 `DriverManager`(`java.sql.DriverManager`)의 `getConnection`메서드가 구현하여 반환한다.
    - 비정적 메서드 
        - `setAutoCommit(boolean b)` : 해당 `Connection` 객체를 통해 벌어지는 일들에 대해 자동으로 커밋(Commit)할지의 여부를 지정한다. 별도의 조치가 없다면 `true`로 지정되어 있다.
        - `commit()` : 해당 `Connection` 객체를 통해 발생한 DML 변경사항을 **적용**한다.
        - `rollback()` : 해당 `Connection` 객체를 통해 발생한 DML 변경사항을 **취소**한다.
- `PreparedStatement`(`java.sql.PreparedStatement`) : DBMS에서 실행할 쿼리(Query)를 담고있는 인터페이스이다. 직접 객체화하지 않고, 위에서 반환된 객체인 `Connection` 객체의 `prepareStatement` 메서드를 통해 객체를 전달 받는다.
    - 비정적 메서드
        - `execute` : 실행 결과가 `ResultSet`으로 나타내어질 수 있는가의 **여부**(대체적으로 `SELECT` 쿼리를 실행했는가)를 반환한다.
        - `executeUpdate` : 실행 결과에 의해 영향을 받은(삽입, 삭제, 수정 등) 레코드의 **개수**를 반환한다. 단, `SELECT`된 개수를 반환하지는 않는다.
        - `executeQuery` : 실행 결과를 `ResultSet` 타입의 객체로 담아 반환한다. 주로 `SELECT` 쿼리 실행시에 사용한다. (기대하는 결과 값이 있을 때)
- `ResultSet` (`java.sql.ResultSet`) : `PreparedStatement` 객체의 `executeQuery` 메서드가 반환하며, `SELECT` 쿼리의 실행 결과를 `Set`의 형태로 가지고 있다. 반복(`Iteration`)을 통해 각 레코드에 순차적으로 접근할 수 있다.
    - 비정적 메서드 
        - `next` : 다음으로 가리킬 레코드가 존재하는가의 **여부**를 반환한다.  
- 커밋(Commit) : DML(Data Manipulation Language, `INSERT`, `SELECT`, `DELETE`, `UPDATE`) 쿼리에 의해 발생한 변경 사항을 적용하는 것.
# 클래스

- 명명법 : 파스칼 케이스
- 클래스(Class)는 서로 관련있는 멤버(Member)를 묶어내기 위해 존재하는 참조 타입(Reference Type)인 객체 단위이다.
- 자바 파일(.java)은 반드시 접근 제한자가 `public`인 파일 이름과 같은 이름을 가지는 구성 요소를 요구한다.
- 멤버(Member) : 어떠한 클래스가 가질 수 있는 구성요소 전체를 아울러 의미한다. 가령, 멤버 변수나 메서드 등이 멤버에 해당한다.
- 구조
  > ```java
  > [접근 제한자] [abstract|final]? class [클래스 이름] [extends [상속할 클래스 이름]]? [implements [구현할 인터페이스 이름,...]]? {
  > }
  > ```
  > - [접근 제한자] : 해당 클래스에 접근할 수 있는 대상을 제한한다.
  > - `abstract` : 해당 클래스가 추상적이게 된다. 추상 클래스는 최종적일 수 없다.
  > - `final` : 해당 클래스가 최정적이게 된다. 더 이상 해당 클래스를 상속 받을 수 없다는 뜻이며, 최종 클래스는 추상적일 수 없다.
  > - `extends` : 상속 받을 클래스를 지정한다. 생략시 `Object`클래스를 상속 받는다. 자세한 것은 해당 문서 '상속' 부분 참고.
  > - `implements` : 구현할 인터페이스를 한 개 이상 지정한다. 생략시 구현하는 인터페이스가 없다. 자세한 것은 '인터페이스' 문서 참고.
  > ```java
  > public class Main {
  > }
  > ```
    - 위 `Main` 클래스의 접근 제한자는 `public`이다.
    - 위 `Main` 클래스는 추상적이지 않다. (`abstract`가 아님)
    - 위 `Main` 클래스는 최종이지 않다. (`final`이 아님)
    - 위 `Main` 클래스의 이름은 당연히 'Main'이다.
    - 위 `Main` 클래스는 `Object` 클래스를 상속 받는다.
    - 위 `Main` 클래스는 구현하는 인터페이스가 없다.
- 클래스가 추상적이라고 하더라도 반드시 추상 메서드를 가져야 하는 것은 아니다.
- 추상 클래스는 일반적인 방식으로 객체화 할 수 없다.

# 생성자
- 생성자(Constructor)는 어떤 참조 타입이 객체화 되기 위해 반드시 한 번 실행되어야 하는 일종의 메서드이다. 단, 일반 메서드와 달리 반환 타입이나 별도의 이름이 없다.
- 생성자 호출이 완료되기 전 까지는 해당 객체가 완전히 객체화되었다고 할 수는 없다.
- 생성자 내의 첫 구문은 반드시 '자기 생성자 호출'(`this(...)`) 혹은 '부모 생성자 호출'(`super(...)`) 둘 중 하나여야 하며, 이가 아니거나, 둘 다 일수는 없다.
- 구조
  > ```java
  > [접근 제한자] [클래스 이름]([매개 변수,...]?) {
  > }
  > ```
- 클래스 내에 생성자를 별도로 만들지 않는다면 항상 **기본 생성자**(_Default Constructor_)가 있는 것이다. 기본 생성자는 아래와 같다.
  > ```java
  > public [클래스 이름]() {
  >     super();
  > }
  > ```

# 상속
 
- 상속(Inheritance)는 클래스간에 1:1로 이루어지며, `extends` 키워드를 이용하여 어떠한 클래스를 상속 받을지 설정할 수 있다.
- 상속은 주로, 부모(Parent)가 되는 클래스의 기능(멤버)을 추가하고자 할 때 사용한다.
- 상속은 상하 관계로 평가된다.
- 상속을 명시하지 않으면 `Object` 클래스를 상속 받는다. (`extends Object` 생략됨)
- 모든 참조 타입은 결과적으로 `Object` 클래스를 상속 받는 것으로 귀결된다.
- 다중 상속 및 순환 상속은 불가하다.

# 구현
# 자료 구조

- 자료 구조(Data Structure)는 자바에서 데이터를 보다 쉽게 이용할 수 있게 하기 위해 만들어졌다.
- 자료 구조의 구조
  - ![자료 구조](./%5B공통%5D%20자료%20구조_1.png)
- Collection(java.util.Collection\<E\>)
    - List(java.util.List\<E\>)
        - 비정적 메서드
            - `add(E e)` : `E`타입의 객체 `e`를 `List`에 추가한다. (현재 리스트(배열)의 크기는 자동으로 늘어난다.)
            - `clear()` : `List`가 가진 원소를 모두 제거한다.
            - `contains(E e)` : 원소 중 전달 받은 `e`객체와 동일한(`equals`) 객체를 가지고 있는지의 **여부**를 반환한다.
            - `get(int i)` : `i`번째 객체를 반환한다.
            - `indexOf(E e)` : `List`가 가진 원소 중 전달된 매개 변수 `e`와 `equals`인 원소의 순번(인덱스)을 반환한다. 없다면, `-1`을 반환한다.
            - `remove(int i)` : `i`번째 객체를 `List`에서 제거한다. (삭제 후 리스트(배열)의 크기는 자동으로 줄어든다.)
            - `remove(E e)` : `List`에서 전달 받은 `e`객체에 대해 `equals(...)` 호출 결과가 `true`인 원소를 제거한다. (삭제 후 리스트(배열)의 크기는 자동으로 줄어든다.)
            - `size()` : 원소의 개수를 반환한다.
        - ArrayList(java.util.ArrayList\<E\>)
            - `ArrayList<E>`는 `E`타입의 객체를 그 원소로 가진다.
            - (일반 배열 처럼) 순번(인덱스 번호)으로 데이터에 접근한다.
            - 일반 배열과 달리 데이터 조회, 추가 및 삭제가 용이해 많이 사용한다.
            - 데이터 조회(접근)는 다른 `List`보다 빠르지만, 데이터 추가 및 삭제는 느린편이다.

- Map (java.util.Map<K, V>)
    - 비정적 메서드
        - `clear()` : 가지고 있는 모든 키-값 쌍을 제거한다. 
        - `containsKey(K k)` : 원소중 전달된 `K`타입의 객체 `k`를 **키로** 가지는 원소가 있는가의 **여부**를 반환한다.
        - `containsValue(V v)` : 원소중 전달된 `V`타입의 객체 `v`를 **값으로** 가지는 원소가 있는가의 **여부**를 반환한다.
        - `get(K k)` : `K`타입의 키 객체 `k`를 키로 가지는 원소의 `V`타입 값 객체를 반환한다. 
        - `keySet()` : 가지고 있는 모든 키-값 쌍의 **키**(들)에 대한 `Set<K>` 객체를 반환한다.
        - `put(K k, V v)` : `K`타입의 키 객체 `k`에 대한 `V`타입의 값 객체 `v`의 쌍을 추가한다.
        - `remove(K k)` : 원소인 키-값쌍 중 키가 전달된 `K`타입의 `k` 객체와 같은(`hashCode()`로 판단) 원소를 제거한다.
        - `size()` : 가지고 있는 모든 키-값 쌍의 개수를 반환한다. 단, 키와 값 쌍 하나를 한개로 판단함으로 유의한다.
        - `values()` : 가지고 있는 모든 키-값 쌍의 **값**(들)에 대한 `Collection<V>` 객체를 반환한다.
    - HashMap (java.util.HashMap<K, V>)
        - `HashMap<K, V>`는 `K`타입의 객체인 키(Key)와, `V`타입의 객체인 값(Value)의 쌍을 원소로 가진다.
        - 각 '키-값 쌍'은 인덱스 번호로 접근할 수 **없다**.
        - 어떠한 값에 접근하기 위해서는 키가 필요하다.
        - `hashCode()`호출 결과가 동일한 같은 타입의 객체를 키로 가지는 원소가 여러개 존재할 수 없다.
# 일반 문법

1. 반복문
    - 향상된 for문(Enhanced For) : 자바스크립트의 `for ... of ...`와 동일한 기능을 한다.
       - 어떠한 배열 혹은 반복 가능한 객체가 가진 원소들을 반복하기 위해 사용한다.
       - 인덱스 번호(주로 `i`)가 변수로서 필요 없다면 사용하도록 한다.
         > ```java
         > for ([원소 선언] : [배열 혹은 반복 가능 객체]) {
         > }
         > ```
         > ```java
         > String[] names = {"김김김", "이이이", "박박박"};
         > for (String name : names) {
         >     System.out.println(name);
         > }
         > // 김김김
         > // 이이이
         > // 박박박
         > ```
       
# 인터페이스

- 인터페이스(Interface)는 어떠한 클래스나 열거형 혹은 인터페이스 간에 그것이 추상적이지 않은 경우 어떠한 메서드를 가지고 있음을 보증받기 위해 사용한다. 혹은 어떤 클래스의 속성을 부여하기 위해 사용하기도 한다.
- 인터페이스를 구현(Implement)하는 클래스(혹은 다른 참조 타입)는 해당 인터페이스를 타입으로 객체를 대입할 수 있다. (일종의 부모처럼 작동함.)
- 명명법 : 파스칼 케이스(주로 `I[형용사|동명사]` 혹은 `-able`형용사, 가령 `IDemanding`, `Closeable` 등)
- 인터페이스가 가지는 모든 멤버 변수는 무조건 `public`인 정적인 상수(`static final`)이다. 고로, `public static final`을 생략한다.
- 인터페이스가 가지는 모든 메서드는 무조건 `public`이고 추상적(`abstract`)이다. 고로, `public abstract`를 생략한다. (단, `default` 키워드를 통해 메서드의 구현부를 작성할 수는 있다.)
# 객체

- 객체란 참조 타입인 값을 의미한다. 기초 타입의 값을 객체라고 하지 않는다. 가령, `5`는 정수 값이며, `"안녕?"`은 **문자열(String) 객체**라고 한다.
- 객체화 : 어떠한 참조 타입을 객체로 만들기 위해 `new` 키워드를 이용하며 `new [참조 타입 이름]([생성자 전달 인자,...]?)` 형식으로 객체화 한다.
    - 가령, `Object` 참조 타입을 객체화 하기 위해 아래와 같이 작성한다.
      > ```java
      > Object obj = new Object();
      > ```
      > ```java
      > int i = new int(); // new 키워드를 이용한 객체화는 참조 타입만 가능함으로 이와 같이 작성할 수 없음. 
      > ```
# 다형성

- 다형성(Polymorphism)은 하나의 객체가 다른 타입으로 변할 수 있는 속성/특징을 의미한다.
- 업 캐스팅(Upcasting) : '자동 형변환'이 일어난다고 하기도 하며, 자식 타입의 객체(인스턴스)가 부모 타입으로 형 변환하는 것을 의미한다.
- 다운 캐스팅(Downcasting) : '강제 형변환'한다 라고 하기도 하며, 부모 타입의 객체(인스턴스)가 자식 타입으로 형 변환하는 것을 의미한다. 단, 말 그대로 강제 형변환임으로 변환할 수 없는 경우 `ClassCastException`이 발생함으로 반드시 `instanceOf`를 사전에 사용해 강제 형변환이 가능한지 확인해야 한다. 다운캐스팅의 피연산자인 변수의 근본이 변환하고자 하는 형으로 변환될 수 없다면 다운캐스팅할 수 없다. 
- 외울 것 : **부모 타입의 변수는 자식 객체를 받을 수 있다.**
# 메이븐

- 메이븐(Maven)은 의존성 관리자의 종류 중 하나이다.
- 메이븐 (공개) 저장소 : [https://mvnrepository.com](https://mvnrepository.com)
- 구조
    - 프로젝트의 메이븐을 관리하기 위해 프로젝트 구조 중 `pom.xml` 파일을 활용한다.
    - `pom.xml` 파일은 그 확장자(`xml`)에서도 알 수 있듯이 XML 문법을 사용한다.
    - `` : 해당 프로젝트와 관련된 메이븐의 설정이 모두 포함되어 있다.
        - `` : 해당 프로젝트를 소유하는 개인/단체의 도메인의 역순이고 아티팩트 패키지를 가질 베이스 패키지 경로 중 일부이다. 가령 `dev.yhpark` 등. 
        - `` : 해당 프로젝트의 아티팩트 아이디이고, 단순히 프로젝트의 이름이라고 생각하면 된다. 단, 패키지 경로에 포함됨으로 이에 유의한다. ``값과 합쳐 베이스 패키지가 된다.
        - `` : 해당 프로젝트에 대한 설명이다.
        - `` : 해당 프로젝트의 현재 버전이다. 버전의 명명은 자유롭게 하면 되는데, `1.x.x`같은 형식이나 `20221020` , `22.10.1.0` 같은 자유로운 사용이 가능하다.
        - `` : 의존성 태그(``)를 담는 역할을 한다.
            - `` : 의존성 정보 하나를 나열하기 위해 사용한다. 만약 의존성이 두 개, 세 개라면 그 개수에 맞게 해당 태그를 이용해야 한다. 
                - `` : 해당 의존성의 그룹 아이디이다.
                - `` : 해당 의존성의 아티팩트 아이디이다.
                - `` : 해당 의존성의 버전이다.

 

'Back > Java' 카테고리의 다른 글

[Java] 일반 문법(반복문)  (0) 2023.02.08
[Java] 연산자와 순위  (0) 2023.02.08
[Java] 타입(Type) 그리고 변수와 상수  (0) 2023.02.07
[Java] 클래스(Class)  (0) 2023.02.07
[Java] Java 기본 개념  (0) 2023.02.07