도도한 개발자

[Java] #18-2. 기본 문법 정리(2) 본문

Backend/Java

[Java] #18-2. 기본 문법 정리(2)

Kiara Kim 2022. 3. 31. 18:00

* 조건문

 

** if

 

if(boolean값) 처리문장;

 

** if-else

 

if(boolean값) 처리문장1;
else 처리문장2;

 

처리문장이 두 줄 이상일 때는

 

if(boolean값) {
  처리문장1;
 } else {
    처리문장2;
 }

 

이렇게 중괄호로 묶어준다.

 

** if-else if

if(boolean값) 처리문장1;
else if(boolean값) 처리문장2;
else if(boolean값) 처리문장3;
...
else 처리문장n;

 

여기서도 위와 같이 처리문장이 한 줄 이상이면 중괄호로 묶어준다.

 

** switch - case

 

switch(비교대상변수) {
case 점검값1:
  처리문장1;
  ...
  break;
case 점검값2
  처리문장2
  ...
  break;
default:
  기본 처리 문장;
  ...
  break;
}

 

여기서 비교 대상 변수는 정수형만 사용 가능 했었지만 JDK7 이상에서는 String도 사용 가능하다.

 

 

* 반복문

 

** while

 

while(boolean조건이 true일 경우 실행) {
  ...
}

 

** do-while : 반복 수행을 하기 전에 적어도 한 번은 처리할 필요가 있을 경우 사용

 

do {
  처리문장;
  ...
} while(boolean조건이 true일 경우 실행);

 

** for 루프 : for 루프가 수행되는 순서는 다음과 같음

 

for(1.초기화; 2,5,8.종료조건; 4,7.조건값 증가) {
  3,6.반복문장
}
9.

 

1 : "초기화"라고 되어 있는 부분에서는 변수를 초기화한다.

2 : "종료조건" 구문이 수행된다. 만약 이 구문의 조건을 만족하지 않으면(결과가 false이면) 그 아래에 있는 "반복문장"은 수행되지 않고 for 루프는 끝나고 9. 문장이 실행된다. "종료조건"을 만족하면(결과가 true이면) 3. "반복문장"이 수행된다.

4 : "조건값 증가"가 수행된다. 보통 "초기화"에서 선언한 변수를 여기서 증가시킨다.

6 : "반복문장"을 수행하기 전에 다시 5. "종료조건"에 맞는지를 다시 확인한다.

6 : "반복문장"을 다시 수행한다.

7 : "조건값 증가"가 다시 수행된다.

8 : "종료조건"을 만족하는지 확인한다.

9 : "종료조건"에 만족하지 않으면 for 루프는 끝나고 그 다음 9. 문장이 수행된다.

 

 

* 접근 제어자

 

º public : 누구나 접근 가능하다.

º protected : 같은 패키지 내에 있거나 상속받은 경우에만 접근 가능하다.

º (package-private) : 아무런 접근 제어자를 적어주지 않을 때이며, package-private라고도 불린다. 같은 패키지 내에 있을 때만 접근 가능하다.

º private : 해당 클래스 내에서만 접근 가능하다.

 

접근 제어자에 따른 접근 범위를 표로 살펴보자.

 

  해당 클래스 안에서 같은 패키지에서 상속 받은 클래스에서 import한 클래스에서
public O O O O
protected O O O X
(package-private) O O X X
private O X X X

 

 

* 선언 시 사용 가능한 제어자

 

클래스, 메소드, 변수를 선언할 때 사용할 수 있는 제어자는 접근 제어자 외에도 다양하다. 표로 살펴보자.

 

제어자 클래스 메소드 변수
접근 제어자 : public, protected, private O O O
구현 필요 제어자 : abstract O O X
하나의 인스턴스만 허용하는 제어자 : static O O O
값 수정 제한 제어자 : final O O O
strict 소수 값 제어자 : strictfp O O X
어노테이션 O O O
동시 접근 제어자 : synchronized X O X
다른 언어로 구현된 것을 명시하는 제어자 : native X O X
실행시의 동작 방법을 알리는 제어자 : transient, volatile X O O

 

 

* 클래스, 인터페이스, abstract 클래스

 

º  자바에서 만든 코드를 관리하는 클래스 파일(.class)이 되는 타입의 종류

  - 클래스

  - 인터페이스

  - abstract 클래스

  - enum 클래스

  - 어노테이션 선언 클래스

 

º 인터페이스와 abstract 클래스, 클래스의 차이

  - 인터페이스

    · 어떤 메소드가 존재해야 하는지에 대한 선언만 되어 있다.

    · 절대로 구현되어 있는 메소드가 있어서는 안 된다.

    · 인터페이스를 구현하는 클래스에서는 implements를 사용하여 선언한다.

  - abstract 클래스

    · 구현되어 있는 메소드가 있어도 상관 없다.

    · abstract으로 선언된 메소드가 1개 이상일 경우 반드시 abstract 클래스로 선언해야 한다.

    · abstract으로 선언된 메소드는 절대로 구현되어 있어서는 안 된다.

    · abstract 클래스를 확장하는 클래스에서는 extends를 사용하여 선언한다.

  - 클래스

    · 인터페이스나 abstract클래스와 다르게 모든 메소드가 구현되어 있다.

 

º 클래스, 인터페이스, abstract 클래스 차이

  인터페이스 abstact 클래스 클래스
선언 시 사용하는 예약어 interface abstract class class
구현 안된 메소드 포함 가능 여부 O(필수) O X
구현된 메소드 포함 가능 여부 X O O(필수)
static 메소드 선언 가능 여부 X O O
final 메소드 선언 가능 여부 X O O
상속(extends) 가능 X O O
구현(implements) 가능 O X X

 

º 클래스 선언 예

 

public class Sample extends Superclass implements InterfaceA, InterfaceB {
...
}

 

º Sample이라는 이름을 가지는 클래스 선언

  - 파일 이름은 Sample.java

  - 대문자로 시작하고, 추가 단어가 있을 경우 첫 문자만 대문자 사용

  - 접근 제어자 사용 가능

 

º Superclass라는 클래스 확장

  - extends 뒤에 부모 클래스의 이름을 명시하며, 반드시 하나의 클래스만 지정 가능하다.

  - abstract 클래스도 extends로 확장할 수 있다.

 

º InterfaceA와 InterfaceB를 구현함

  - 한 개 이상의 구현할 인테페이스 이름을 명시한다.

  - implemets로 구형을 한다고 명시할 때는 인터페이스에 선언된 모든 메소드가 이 클래스에서 구현 되어야 한다.

 

º 인터페이스 선언 예

public interface InterfaceA {
    public void methodA();
    public void methodB();
}

  - 구현되어 있는 메소드가 하나도 있으면 안 된다.

 

º abstract 클래스 선언 예

public abstract class AbstractClass {
    public abstract void methodC();
    public void methodd(){
    }
}

  - abstract으로 선언된 메소드가 하나라도 있을 경우 클래스를 abstract으로 선언되어야만 한다.

 

º enum 클래스 선언 예

public enum EnumClass {
    THREE_HOUR(18000).
    FIVE_HOUR(30000),
    /* 중간 생략 */
 }

  - enum 클래스는 상수를 열거하기 위한 용도로 사용한다.

  - enum 클래스의 상수는 이름만 정의해도 된다.

  - 별도의 생성자를 만들어 각 상수의 값을 지정할 수 있다.

  - 모든 enum 클래스의 부모 클래스는 java.lang.Enum 클래스 뿐이다.

  - enum에 메소드를 만들어 기능 추가 가능

 

º 어노테이션 선언 예

import java.lang.annotation.*;

@Target(ElementType.METHOD)
@Retention(RetentionPolcy.RUNTIME)
public @interface AnnotationDefinition {
    public int number();
    public String text() default "This is first annotation";
}

  - 대상(@Target)과 적용 범위(@Retention)를 명시하는 것이 좋다.

  - @interface를 사용하여 어노테이션이라는 것을 명시한다.

 

 

* 메소드 선언

 

메소드는 자바에서 클래스의 행위(behavior)를 처리하는 데 사용됨

º 기본적인 메소드의 선언 예

public void method(String param, int ... params) {
  // 메소드 내용
}

  - method라는 이름을 갖는 메소드다.

  - public과 같은 제어자 선언이 가능하다.

  - void로 선언되어 있어 리턴되는 값이 없다.

  - param이라는 String 타입의 매개 변수를 가진다.

  - params라는 여러 개의 int 타입을 콤마로 구분하여 매개 변수로 지정 가능하다.

 

 

* 자주 쓰는 "상속"

 

자바 개발 시 상속을 자주 사용한다. 만약 자주 사용하지 않고 상속되어 있는 클래스가 적다면, 리팩토링이라는 단계를 거쳐서 반복되는 메소드를 상위 클래스로 구분해 주는 것이 좋다. 그래야 코드의 재사용성과 유지 보수성, 가독성이 높아진다. 상속 관계가 발생했을 때 생성자, 메소드, 변수는 각각 어떻게 지정하고 동작하게 되는지 정리해보자.

 

º 생성자

  - 자식 클래스의 생성자가 호출되면 자동으로 부모 클래스의 매개 변수가 없는 기본 생성자가 호출됨. 명시적으로 super()라고 지정 가능하다.

  - 부모 클래스의 생성자를 명시적으로 호출하려면 super()를 사용하면 된다.

º 메소드

  - 부모 클래스에 선언된 메소드들이 자신의 클래스에 선언된 것처럼 사용 가능하다.(private 제외)

  - 부모 클래스에 선언된 메소드와 동일한 시그니처를 사용함으로써 메소드 overriding이 가능하다.

  - 부모 클래스에 선언되어 있지 않은 이름의 새로운 메소드 선언이 가능하다.

º 변수

  - 부모 클래스에 private로 선언된 변수를 제외한 모든 변수가 자신의 클래스에 선언된 것처럼 사용 가능

  - 부모 클래스에 선언된 변수와 동일한 이름을 가지는 변수 선언 가능(권장x)

  - 부모 클래스에 선언되어 있지 않는 이름의 변수 선언 가능

 

 

* 예외 처리

 

º try-catch 기본 구문

 

try {
  // 예외 발생 가능 문장
} catch(예외1 e1) {
  // 예외1이 발생했을 때 처리 문장
} catch(예외2 e2) {
  // 예외2가 발생했을 때 처리 문장
} finally {
  // try나 catch가 어떻게 수행되었든 간에 수행되는 문장
}

 

º 자바에서 사용하는 예외의 종류

  - checked exception : try-catch로 묶어 줘야 하는 예외이며, 컴파일시 예외 처리 여부를 체크한다.

  - error : 자바 프로세스에 영향을 주는 예외이며, 실행시 발생한다.

   - runtime exception 혹은 unchecked exception : try-catch로 묶지 않아도 컴파일시 체크를 하지 않는 예외이며,

     실행시 발생하는 예외이다.

 

º throw와 throws

  - throw : 예외 객체를 던지기 위해 사용한다.

  - throws : 예외가 발생하면 던질 것이라고 메소드 선언시 사용한다.

  - 메소드를 선언할 때 매개 변수 소괄호 뒤에 throws라는 예약어를 적어 준 뒤 예외를 선언하면

    해당 메소드에서 선언한 예외가 발생하면 호출한 메소드로 예외가 전달된다.

  - 두 가지 이상의 예외를 던지게 된다면 implements 처럼 콤마로 구분하여 예외 클래스 이름을 적어준다.

  - try 블록 내에서 예외를 발생시킬 경우에는 throw라는 예약어를 적어 준 뒤 예외 객체를 생성하거나,

    생성되어있는 개체를 명시한다.

  - throw한 예외 클래스가 catch 블록에 선언되어 있지 않거나, throws 선언에 포함되어 있지 않으면

    컴파일 에러가 발생한다.

  - catch 블록에서 예외를 throw할 경우에는 메소드 선언의 throws 구문에 해당 예외가 정의되어 있어야 한다.

 

 

* Object 클래스

 

Object 클래스는 모든 클래스의 가장 최상위 부모 클래스이다. 따라서 이 클래스에 선언되어 있는 모든 메소드들은 자바에서 사용하는 모든 클래스에서 사용할 수 있다. 

 

º Object 클래스의 주요 메소드

  - clone() : 객체의 복사본을 만들어 리턴한다.

  - equals() : 현재 객체와 매개 변수로 넘겨받은 객체가 같은지 확인한다.

  - finalize() : 현재 객체가 더 이상 쓸모 없어졌을 때 가비지 컬렉터(garbage collector)에 의해 이 메소드가 호출된다.

  - getClass() : 현재 객체의 Class 클래스의 객체를 리턴한다.

  - hashCode() : 객체에 대한 해시 코드 값을 리턴한다.

  - String toString() : 객체를 문자열로 표현하는 값을 리턴한다.

  - wait(), notify(), notifyAll() : 쓰레드 처리시 사용하는 메소드들이다.

 

 

* String 클래스

 

String 클래스 자바에서 사용되는 클래스 중 가장 특이한 클래스이며, 이 클래스의 특성을 알아야 제대로 된 개발을 할 수 있다.

 

º String 클래스의 특징

  - new를 사용하여 객체를 생성할 수 있는 유일한 클래스이다.

  - 더하기 연산이 가능하다.

  - 더하기 연산을 할 경우 String 클래스는 기존 문자열은 버리고 새로운 객체를 생성한다.

 

º String 클래스의 주요 메소드

  - getBytes() : 문자열을 byte 배열로 변경한다.

  - length() : 문자열의 길이를 리턴한다.

  - isEmpty() : 문자열이 비어 있는지를 확인한다.

  - equals() : 두 문자열의 값이 같은지 확인한다.

  - startsWith(), endsWith() : 매개 변수로 넘어온 문자열로 시작하는지, 끝나는지를 확인한다.

  - contains() : 매개 변수로 넘어온 문자열이 포한되어 있는지 확인한다.

  - indexOf(), lastIndexOf() : 매개 변수로 넘어온 문자열이 있는 위치를 0부터 시작하는 값으로 리턴한다.

    만약 없으면 -1을 리턴한다.

  - substring(), subsequence() : 문자열의 특정 범위 값을 잘라 리턴한다.

  - split() : 문자열을 매개 변수로 넘어온 정규 표현식에 따라 String 배열로 리턴한다.

  - concat() : 기존 문자열 뒤에 매개 변수로 넘어온 문자열을 합친다.

  - trim() : 문자열의 맨 앞과 뒤에 있는 공백을 제거한다.

  - replace() : 문자열의 특정 위치의 내용을 매개 변수로 넘어온 값으로 변경한다.

  - format() : 문자열을 정해진 포맷으로 변환한다.

  - intern() : 절대 쓰면 안되는 메소드이다.

 

º StringBuffer와 StringBuilder 클래스

  - String의 단점을 보완하기 위해 제공되는 클래스들이다.

  - StringBuffer는 쓰레드에 안전하고, StringBuilder는 그렇지 못하다.

  - append() 메소드를 사용하여 문자열을 더할 수 있다.

  -  만약 문자열을 더하면 컴파일러에서 StringBuilder 클래스로 변환한다.

 

 

* 어노테이션 선언 시 사용하는 메타 어노테이션

 

@Targer, @Retention, @Documented, @Inherited

 

º JDK에 선언되어 있는 어노테이션

  - @Override : Override한다는 것을 명시적으로 선언할 때 사용한다.

  - @Deprecated : 더 이상 사용하지 않아 Depreated 되었다는 것을 명시저으로 선언할 때 사용한다.

  - @SupressWarnings : 컴파일러의 경고를 무시하도록 하려고 할 때 사용한다.

 

º Target 어노테이션에서 사용하는 ElementType의 종류

 

요소 타입 대상
CONSTRUCTOR 생성자 선언시
FIELD enum 상수를 포함한 필드(field)값 선언시
LOCAL_VARIABLE 지역 변수 선언시
METHOD 메소드 선언시
PACKAGE 패키지 선언시
PARAMETER 매개 변수 선언시
TYPE 클래스, 인터페이스, enum등 선언시

  - 두 개 이상의 ElementType을 선언할 경우 아래와 같이 배열을 선언할 때 처럼 중괄호로 묶어 사용한다.

 

@Target({ElementType.METHOD, ElementType.TYPE})

 

º Retention 어노테이션에서 사용하는 RetentionPolicy의 종류

 

요소 타입 대상
SOURCE 어노테이션 정보가 컴파일시 사라짐
CLASS 클래스 파일에 있는 어노테이션 정보가 컴파일러에 의해 참조 가능함. 그러나 가상 머신에서는 사라짐
RUNTIME 실행시 어노테이션 정보가 가상 머신에 의해서 참조 가능함

 

 

* API의 기초

 

자바 API 문서는 Oracle 홈페이지에서 직접 확인할 수도 있고, 개발 PC에 다운로드해서 볼 수도 있다. 압축을 해제한 문서의 api 디렉터리로 이동 후 index.html을 실행하면 API 문서를 브라우저로 볼 수 있다.

 

API 화면 구성

 

 

 

그럼 이만.