OOP-1(Basic)

in Java, OOP

객체지향 프로그래밍 (Object Oriented Programming; OOP)

객체지향 프로그래밍이란

  • 컴퓨터 프로그래밍 패러다임 중 하나
  • 프로그램을 명령어의 목록으로 보는 시각에서 벗어나, 독립된 단위인 객체의 모임으로 파악
  • 각각의 객체는 메세지를 주고받고, 데이터를 처리

객체지향의 기본 구성 요소

  • 클래스 (Class)
    • 같은 종류의 집단에 속하는 속성과 행위를 정의한 것
    • 클래스는 다른 클래스 또는 외부 요소와 독립적으로 디자인해야 함
  • 객체 (Object)
    • 클래스의 인스턴스로, 실제로 메모리상에 할당된 것
    • 자신 공유의 속성을 가지며, 클래스에 정의된 행위를 수행
  • 메소드 (Method)
    • 클래스로부터 생성된 객체를 사용하는 방법
    • 메소드는 한 객체의 속성을 조작하는 데에 사용

객체 지향의 특징

  • OOP is A.P.I.E
    • Abstraction (추상화): 자료 표현을 추상적으로 나타내는 추상 자료형을 사용한다.
    • Polymorphism (다형성): 오버로딩과 오버라이딩을 하여 하나의 메소드명으로 다양한 동작을 구현할 수 있다.
    • Inheritence (상속): 부모 클래스로부터 속성과 메소드를 상속받아 사용할 수 있다.
    • Encapsulation (캡슐화): 사용자에게 불필요한 정보를 은닉/보호해야 한다.

Comment and share

배열 (Arrays)

배열의 특성

  • 하나의 변수로 여러개의 값을 다룰 수 있다.
  • 동일한 자료형의 값만 다룰 수 있다.
  • 한번 생성된 배열의 크기는 변하지 않는다.
  • 배열에 속한 값은 메모리에 연속적으로 위치한다.

배열의 생성

  • 배열의 선언

    1
    2
    int[] intArray;// 자료형[] 변수명; recommended
    int integerArray[];// 자료형 변수명[]; old c-style
  • 배열의 생성/초기화

    • 생성 후 값 할당

      1
      2
      3
      int[] intArray = new int[10];
      intArray[0] = 4;
      intArray[1] = 10;
      1
      2
      int[] intArray;
      intArray = new int[]{4, 5, 1, 2, 5};
    • 생성과 동시에 값 할당

      1
      2
      int[] intArray = {3, 5, 1, 20, 65};
      int[] intArray2 = new int[]{4, 6, 2, 3, 4};

배열과 반복문

  • 인덱스를 이용한 배열 접근

    1
    2
    3
    4
    float[] floatArray = new float[10];
    for (int i = 0; i < floatArray.length; i++) {
    floatArray[i] = i * 0.5;
    }
  • 향상된 for 문을 이용한 배열 접근

    1
    2
    3
    4
    int[] intArray = {4, 5, 1, 2, 7, 5};
    for (int value: intArray) {
    System.out.println(value);
    }

배열의 크기 변경

  • 배열의 크기는 변경할 수 없으므로 새로운 배열을 만들고 데이터를 옮겨야 한다.
1
2
3
4
5
int[] src = {1, 2, 3, 4, 5};
int[] dst = new int[10];
for(int i = 0; i < source.length; i++) {
dst[i] = src[i];
}
1
2
3
int[] src = {1, 2, 3, 4, 5};
int[] dst = new int[10];
System.arraycopy(src, 0, dst, 0, src.length);

Comment and share

문자열 (Strings)

문자열의 특징

  • 클래스로 구현되어 있다.
  • 내부에 문자의 배열로 데이터가 구현되어 있다.
  • 한번 만든 문자열은 변하지 않는다. (Immutable)

문자열의 생성

  • new 키워드를 이용하여 생성

    1
    String string = new String("문자열 생성");
  • new 키워드 없이 생성 (권장)

    1
    String string = "문자열 생성";

문자열 메소드

메소드 메소드 선언 설명
length() public int length() 문자열의 길이를 출력
charAt() public char charAt(int index) index번째에 위치한 문자 출력
indexOf() public int indexOf(char ch) ch가 위치한 index 출력. 없을 시 -1
equals() public boolean equals(Object anObject anObject와 비교한 결과 출력
equalsIgnoreCase() public boolean equalsIgnoreCase(String anotherString) 대소문자 구분없이 anotherString과 비교 결과 출력
replace() public String replace(char odlChar, char newChar) oldChar를 찾아 newChar로 변경된 문자열 출력
substring() public String substring(int beginIndex, int endIndex) 문자열을 beginIndex부터 endIndex-1까지 잘라서 출력
trim() public String trim() 문자열 좌우 공백을 없앤 결과를 출력
matches() public boolean matches(String regex) 문자열을 정규표현식 regex 확인 결과 출력
split() public String[] split(String regex) 문자열을 정규표현식 형태로 나눈 후 배열로 출력

Comment and share

다차원 배열 (N-D Arrays)

다차원 배열의 정의

  • 배열을 담고 있는 배열을 다차원 배열이라고 한다.
  • 수학의 선 -> 면 -> 공간 등과 동일한 개념

다차원 배열의 생성

  • 다차원 배열의 선언

    1
    2
    3
    int[] array2D[];
    int[][] array2D;
    int array2D[][];
  • 다차원 배열의 생성

    • 여러 차원의 배열을 동시에 생성

      1
      int[][] array2D = new int[5][10];
    • 상위 차원의 배열부터 생성

      1
      2
      3
      4
      int[][] array2D = new int[5][];
      for (int i = 0; i < array2D.length; i++) {
      array2D[i] = new int[10];
      }
  • 다차원 배열의 초기화

    1
    2
    3
    int[][] array2D = {{3, 5, 1, 20, 65},
    {5, 2, 6}, // length may vary
    {10, 3, 5, 67, 3}};

배열과 반복문

  • 인덱스를 이용한 배열 접근

    1
    2
    3
    4
    5
    6
    int[][] array2D = new int[10][10];
    for (int i = 0; i < array2D.length; i++) {
    for (int j = 0; j < array2D[i].length; j++) {
    array2D[i][j] = i * j;
    }
    }

Comment and share

반복문 (Loops)

반복문의 일반적인 구성

  • 초기화 (Initialization)
  • 조건식 (Conditional Expression)
  • 실행문 (Execution Statement)
  • 증감식 (Increment and Decrement Statement)

다양한 반복문

for 문

1
2
3
for(초기화; 조건식; 증감식) {
// 실행문
}

while 문

  • while 문의 경우 실행문이 한번도 실행되지 않을 수도 있다.
1
2
3
4
5
// 초기화
while(조건식) {
// 실행문
// 증감식
}

do ~ while 문

  • do ~ while 문의 경우 실행문은 무조건 한번 이상 실행된다.
1
2
3
4
5
//초기화
do {
//실행문
//증감식
} while(조건식)

반복문 제어

break 문

  • 반복문을 곧바로 종료한다.
1
2
3
4
5
6
7
while (조건식) {
if (종료조건) {
break;
}
//실행문
//증감식
}

continue 문

  • 반복문을 곧바로 다음 반복으로 건너 뛴다.
  • while 문의 경우 증감식이 실행되지 않을 수 있다.
1
2
3
4
5
6
7
8
while (조건식) {
if (제어조건) {
//증감식
continue;
}
//실행문
//증감식
}

label

  • 중첩 반복문에서 어떤 반복문을 제어할지 결정
1
2
3
4
5
6
7
8
9
10
11
12
loop1: for (int i = 0; i < 10; i++) {
loop2: for (int j = 0; j < 10; j++) {
if (j == 3) {
break;
// break loop1;
// break loop2;
// continue;
// continue loop1;
// continue loop2;
}
}
}

Comment and share

조건문 (Conditional Statements)

조건문의 구성

  • 조건식 (Conditional Expression), 실행문 (Execution Statement)

다양한 조건문

if 계열 조건문

if 문

1
2
3
4
5
6
if(조건식)
// 실행문

if(조건식) {
// 실행문
}

if ~ else 문

1
2
3
4
5
if(조건식) {
// 조건식이 true일때 실행할 실행문
} else {
// 조건식이 false일때 실행할 실행문
}

if ~ else if ~ else 문

1
2
3
4
5
6
7
if(조건식1) {
// 조건식1이 true일때 실행할 실행문
} else if(조건식2) {
// 조건식1이 false이고, 조건식2가 true일때 실행할 실행문
} else {
// 모든 조건식이 false일 때 실행할 실행문
}

Nested if 문

1
2
3
4
5
6
7
8
9
if(조건식1) {
if(조건식2) {
// 조건식1과 조건식2가 true일때 실행할 실행문
} else {
if(조건식3) {
// 조건식1과 조건식3이 true이고 조건식2가 false일때 실행할 실행문
}
}
}

switch ~ case

  • 조건식과 비교할 대상이 여럿일 때 사용
    • 조건식의 출력은 정수값, 문자열, 열거형 등 정확한 값을 리턴
1
2
3
4
5
6
7
8
9
10
switch(조건식) {
case 비교값1:
// 실행문1
break;
case 비교값2:
// 실행문2
break;
default:
// 실행문3
}
  • Fall-through
    • break 문을 사용하지 않고 다음 case문을 실행시키는 방법
1
2
3
4
5
6
7
8
9
10
11
switch(조건식) {
case 비교값1:
// 실행문1
case 비교값2:
// 실행문2
default:
// 실행문3
}
// 비교값1에 해당할 경우: 실행문1, 실행문2, 실행문3 실행
// 비교값2에 해당할 경우: 실행문2, 실행문3 실행
// 해당하는 값이 없을 경우: 실행문3 실행

Comment and share

연산자 (Operators)

연산의 구성

  • 연산자 (Operator), 피연산자 (Operand), 연산식 (Expression)

우선순위 표

  • 우선순위가 같은 경우, 결합 방향 순으로 이루어진다.

    연산자 결합 방향 우선순위
    () 1
    ++ – + - ~ ! (int) 2
    * / % 3
    + - 4
    << >> >>> 5
    > < >= <= instanceof 6
    == != 7
    & 8
    ^ 9
    | 10
    && 11
    || 12
    ?: 13
    = += -= *= /= %= ^= |= <<= >>= >>>= 14

다양한 연산자

산술 연산자 (Arithmatic Operators)

연산자 기능
+ 두 피연산자의 합
- 두 피연산자의 차
* 두 피연산자의 곱
/ 두 피연산자의 나눈 몫
% 두 피연산자의 나눈 나머지(Modulus)
  • 산술 연산자 사용 시 주의점
    • 정수형: 오버플로우
    • 실수형: 정확도
    • /, % : Infinity, NaN

대입 연산자 (Assignment Operators)

연산자 기능
= 우측 피연산자의 값을 좌측 피연산자 변수에 할당
+= 두 피연산자의 합을 좌측 피연산자에 할당
-= 두 피연산자의 차를 좌측 피연산자에 할당
*= 두 피연산자의 곱을 좌측 피연산자에 할당
/= 좌측 피연산자를 우측 피연산자로 나눈 몫을 좌측 피연산자에 할당
%= 좌측 피연산자를 우측 피연산자로 나눈 나머지를 좌측 피연산자에 할당

비교 연산자 (Comparison Operators)

연산자 기능
< 좌측 피연산자가 우측 피연산자보다 작은가?
> 좌측 피연산자가 우측 피연산자보다 큰가?
<= 좌측 피연산자가 우측 피연산자보다 작거나 같은가?
>= 좌측 피연산자가 우측 피연산자보다 크거나 같은가?
== 좌측 피연산자와 우측 피연산자가 같은가?
!= 좌측 피연산자와 우측 피연산자가 다른가?
  • 비교 연산자의 출력은 true 또는 false이다.

논리 연산자 (Logical Operators)

연산자 기능
& AND
| OR
! NOT
^ XOR
Short Circuit 연산자 기능
&& AND
|| OR

증감 연산자 (Increment and Decrement Operators)

연산자 기능
++ (Prefix) 피연산자의 값을 1 증가한 후 연산식 평가
++ (Postfix) 연산식을 평가한 후에 피연산자의 값을 1 증가
– (Prefix) 피연산자의 값을 1 감소시킨 후 연산식 평가
– (Postfix) 연산식을 평가한 후에 피연산자의 값을 1 감소

삼항 연산자 (Ternary Operator)

연산자 기능
? : 첫 피연산자의 값의 true이면 두번째 연산자를, false이면 세번째 연산자를 출력

비트 연산자 (Bitwise Operator)

  • 비트 연산자는 정수형을 피연산자를 대상으로 한다.

  • 논리 비트 연산자

    연산자 기능
    & Bitwise AND
    | Bitwise OR
    ~ Bitwise INV
    ^ Bitwise XOR
  • 이동 비트 연산자 (Shift Operator)

    연산자 기능
    << 좌측 피연산자의 각 비트를 왼쪽으로 우측 피연산자만큼 이동시킨다. 빈자리는 0으로 채운다.
    >> 좌측 피연산자의 각 비트를 우측으로 우측 피연산자만큼 이동시킨다. 빈자리는 Sign Bit로 채운다.
    >>> 좌측 피연산자의 각 비트를 우측으로 우측 피연산자만큼 이동시킨다. 빈자리는 0으로 채운다.

Comment and share

자료의 입출력 (Inputs and Outputs)

출력 메소드

  • 포맷 문자열을 이용한 문자열/기본형 출력
  • 객체를 직접 출력

PrintStream의 출력 메소드

메소드 메소드 선언 설명
print() public void print(Object obj) obj를 스트림으로 출력한다.
println() public void println(Object x) x를 스트림으로 출력하고 줄바꿈한다.
printf() public PrintStream printf(String format, Object ... args) Format 맞추어 args를 출력한다.

포맷 문자열 지시자

지시자 설명
%b boolean
%d decimal integer
%o octal
%x, %X hexadecimal
%f decial float
%e, %E exponent
%c character
%s string
%n newline

지시자 자릿수 표현

표현 설명
%nd 최소 n칸을 사용하고 숫자를 오른쪽 정렬
%-nd 최소 n칸을 사용하고 숫자를 왼쪽 정렬
%0nd 최소 n칸을 사용하고 빈칸은 0으로 채움
%n.mf 최소 n칸을 사용하고 소수점 이하 m자리까지 표현

시간을 출력하는 포맷 문자

지시자 설명 예시
%tH 24시간 표기법의 시간 22
%tl 12시간 표기법의 시간 08
%tM 59
%tS 60
%tp 오전/오후 AM
%tT %tH:%tM:%tS 23:11:06
%tR %tH:%tM 16:42
%tr %tl:%tM:%tS %tp 04:15:55 PM

날짜를 출력하는 포맷 문자

지시자 설명 예시
%tB March
%tb 축약형 월 Mar
%tm 03
%tA 요일 Monday
%ta 축약형 요일 Mon
%tY 년도 2020
%ty 축약형 년도 20
%td 09
%te 9
%tZ Time Zone KST
%tD %tm/%td/%ty 02/24/89
%tF %tY-%tm-%td 1989-02-24
%tc %ta %tb %td %tT %tZ %tY Sun Feb 24 07:20:15 KST 1989

입력 메소드

  • Scanner 클래스를 이용하여 입력받을 수 있다.

    1
    2
    3
    4
    5
    import java.util.Scanner;

    ...

    Scanner scanner = new Scanner(System.in);
  • Scanner 클래스의 주요 메소드

메소드 메소드 선언 설명
next() public String next() 공백을 기준으로 한 단어씩 입력받는다.
nextLine() public String nextLine() 한 줄 전체를 입력받는다.
nextInt() public int nextInt() int 값을 입력받는다.
nextDouble() public double nextDouble() double 값을 입력 받는다.
close() public void close() 입력 스트림을 종료한다.

Comment and share

자료형 (Data Type)

자료형이란

  • 변수의 종류, 타입

  • 기본형 (Primitive Type)

    • 값을 변수에 직접 저장하는 자료형

      종류 자료형 크기 (byte)
      문자 char 2
      정수 byte, short, int, long 1, 2, 4, 8
      실수 float, double 4, 8
      논리 boolean 1
      • 정수형의 값 표현 범위

        자료형 범위
        byte -2^7 ~ 2^7 - 1
        short -2^15 ~ 2^15 - 1
        int -2^31 ~ 2^31 - 1
        long -2^63 ~ 2^63 - 1
      • 실수형의 값 표현 범위

        자료형 범위 m e
        float -m * 10^e ~ m * 10^e 23 8
        double -m * 10^e ~ m * 10^e 52 11
  • 참조형 (Reference Type)

    • 값을 직접 저장하지 않고, 값이 저장된 주소를 저장
      ex) Date birthDay = new Date();

여러가지 자료형

정수형

  • 정수 리터럴
    • 진수 표기법
      진수법 접두어 예시
      10진수(decimal) - 32
      2진수(binary) 0b 0b1011
      8진수(octal) 0 0342
      16진수(hexadecimal) 0x 0x4A
    • 정수 리터럴은 기본적으로 int 자료형
    • int 범위를 넘어서는 리터럴의 경우 L을 붙여서 표기
      ex) long largeValue = 100000000000L;
    • 가독성 향상을 위해 세자리 수 마다 _를 이용해 천단위 표기
      ex) long largeValue = 100_000_000_000L;

실수형

  • 실수 리터럴
    • 실수 리터럴은 기본적으로 double 자료형
    • f를 붙여 float 타입을 표현할 수 있음
      ex) float value = 14.42f;
    • e를 이용해 지수 표현을 할 수 있음
      ex) double value = 1.42e3; 1.42 * 10^3 = 1420

문자형

  • ASCII 코드

    • 작은 따옴표로 표현하며, 문자는 기본적으로 ASCII 코드로 저장됨
      ex) char asciiCharacter = 'A';
    • ASCII 코드의 특수 문자 입력
    의미 표시
    tab \t
    backspace \b
    newline \n
    form feed \f
    \ \\
    carriage return \r
    \'
    \"
  • 유니코드 테이블

    • 유니코드는 \u + 16진수로 표현
      ex) char unicodeCharacter = '\u0041';

논리형

  • true, false 두 가지 값만이 허용된다.

    1
    2
    boolean isTrue = true;
    boolean isFalse = false;

문자열

  • 문자열은 참조형 자료형이며, 큰 따옴표로 표현한다.

    1
    String s = "문자열은 큰따옴표로 묶는다.";
  • 문자열은 덧셈으로 이어 붙일 수 있다. 문자열로 변환이 가능한 자료형은 문자열로 변환되어 결합한다.

    1
    2
    String s1 = "a" + "b" + "c";
    String s2 = 1 + "1" + 3;

형변환 (Type Casting)

형변환 연산자

  • 형변환 연산자는 ()로 변수 앞에 입력한다.
    ex) int value = (int)10.8; -> value = 10

업캐스팅 (Upcasting)

  • 값의 범위가 더 큰 자료형으로 변환하는 경우

    • 묵시적(Implicit)/명시적(Explicit) 방법 모두 사용 가능

      1
      2
      3
      byte x = 10;
      int y = (int)x;
      int z = x;

다운캐스팅 (Downcasting)

  • 값의 범위가 더 작은 자료형으로 변환하는 경우

    • 명시적인 방법으로만 캐스팅 가능

      1
      2
      3
      int x = 1024;
      // byte y = x;
      byte z = (byte)x;
      1
      2
      3
      4
      long x = 100;
      float y = x;
      // long z = y;
      long z = (long)y;

Comment and share

변수 (Variable)

변수란

  • 변하는 수
  • 변하는 값이 할당 될 수 있는 메모리의 공간

목차

  • 변수의 선언
  • 변수의 자료형, 변수명, 리터럴
  • 변수명의 규칙

변수의 선언

  • 자료형 변수명 = 값;
  • ex) int variable = 10;

변수의 자료형

  • 기본형(Primitive Type) : int, float, double, boolean
  • 참조형(Reference Type) : Integer, Float, Double, Boolean, String, 여러 클래스 등

리터털

  • 리터럴(literal)이란 소스 코드의 고정된 값을 대표하는 용어
  • ex) int value = 10; (10 -> 리터럴)

변수명 규칙

  • 예약어 사용 x | ex) int int;, int const;
  • 맨 앞 숫자 x | ex) int 4floor;
  • _ 을 제외한 특수문자 | ex) int %value;

변수명의 권장 사항

대상 내용
변수명 의미있는 내용을 사용하여 변수의 용도를 알 수 있게 한다.
클래스, 인터페이스, Enum, 애너테이션 PascalCase
변수, 메소드 camalCase
상수 CONSTANT_NUMBER

Comment and share

Yechan Kim

author.bio


author.job