Skip to content

Latest commit

 

History

History
454 lines (374 loc) · 12.9 KB

220304.md

File metadata and controls

454 lines (374 loc) · 12.9 KB

if 문

if (조건식) {
    // 조건식이 true일 때 수행될 문장
}

if-else 문

if (조건식) {
    // 조건식이 true일 때
} else {
    //조건식이 false일 때
}

if-else if 문

if (조건식1) {
    // 조건식1이 true일 때
} else if (조건식2) {
    // 조건식1이 false, 조건식2가 true일 때
}

switch 문

처리해야 하는 경우의 수가 많을 때 유용

switch (조건식) {
    case 값1 :
        // 조건식의 결과가 값1과 같은 경우
        break;
    case 값2 :
        break;
    default :
        // 조건식의 결과와 일치하는 case문이 없을 때
}
  1. 조건식 계산
  2. 조건식의 결과와 일치하는 case문으로 이동
  3. 이후의 문장들 수행
  4. break문이나 switch문의 끝을 만나면 switch문 전체를 빠져나감

조건식은 정수, 문자열이어야 한다.
case문의 값은 정수 상수(문자 포함), 문자열만 가능하며, 중복되지 않아야 한다.

int month = 1;
switch(month) {
    case 3: case 4: case 5:
        System.out.println("봄");
}

이렇게도 가능하다.

난수 만들기

Math.random()은 0.0과 1.0사이의 double형 난수를 반환한다. 1.0은 포함되지 않는다.

범위는 연산과 형 변환을 통해 맞춰줄 수 있다.

0.0 * 3 <= Math.random() * 3 < 1.0 * 3
(int)0.0 <= (int)(Math.random() * 3) < (int)3.0
0 + 1 <= (int)(Math.random() * 3) + 1 < 3 + 1
1 <= (int)(Math.random() * 3) + 1 < 4

for 문

for (초기화; 조건식; 증감식) {
    수행될 문장
}

while 문

while (조건식) {
    수행될 문장
}

조건식의 연산 결과가 true인 동안 반복한다.

do-while 문

do {
    수행될 문장
} while (조건식);

블럭을 최소한 한 번 이상 반복한다.

break 문

자신이 포함된 하나의 반복문을 벗어난다.

continue 문

자신이 포함된 반복문의 끝으로 이동, 즉 다음 반복으로 넘어간다.
전체 반복 중에서 특정 조건시 반복을 건너뛸 때 유용하다.

이름붙은 반복문

반복문에 이름을 붙여서 break 문을 이용해 하나 이상의 반복문을 벗어날 수 있다.

public class Ex2 {

	public static void main(String[] args) {
		Loop1 : for(int i=2; i <= 9; i++) {
			for(int j=1; j <= 9; j++) {
				if (j==5)
					break Loop1;
				System.out.println(i+"*"+j+"="+i*j);
			}
			System.out.println();
		}
	}

}

21=2
2
2=4
23=6
2
4=8

배열

배열은 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것을 말한다.

int[] score = new int[5];
선언 방법 선언 예
타입[] 변수이름; int[] score;
String[] name;
타입 변수이름[]; int score[];
String name[];

배열의 길이

배열이름.length

int[] arr = new int[5];
int tmp = arr.leangth; // 5

배열은 한번 생성하면 그 길이를 바꿀 수 없다.

배열의 초기화

배열의 각 요소에 처음으로 값을 저장하는 것을 말한다.
기본적으로 자동 초기화가 된다.

int[] score = new int[]{50, 60, 70, 80, 90};
int[] score = {50, 60, 70, 80, 90};
int[] score;
score = {50, 60, 70, 80, 90}; // 에러 발생
score = new int[]{50, 60, 70, 80, 90}; // 성공

배열의 출력

int[] iArr = {100, 95, 80, 70, 60};
System.out.println(Arrays.toString(iArr));

[100, 95, 80, 70, 60]

Arrays.toString()은 배열의 모든 요소를 문자열로 반환해준다.

String 배열

String[] name = new String[3]; // 3개의 문자열을 담을 수 잇는 배열을 생성

String은 참조형이기 때문에 초기화는 null로 된다.

커맨드 라인을 통해 입력받기

커맨드 라인에 입력한 값이 문자열 배열에 담겨서 전달된다.

import java.util.Arrays;

public class Ex2 {

	public static void main(String[] args) {
		System.out.println("매개변수의 개수 :"+args.length);
		System.out.println(Arrays.toString(args));
	}

}

이차원 배열

int[][] score = new int[4][3]; // 4행 3열

초기화

int[][] arr = new int[][]{ {1, 2, 3}, {4, 5, 6} };
int[][] arr = { {1, 2, 3}, 
                {4, 5, 6}
            };

String 클래스

String 클래스는 char[]와 메소드(기능)를 결한한 것이다.
String 클래스는 내용을 변경할 수 없다. (read only)

String a = "a";
String b = "b";
a = a + b;

위 예제에서 문자열 결합으로 "ab"는 만들어지지만 a가 변경되는 것이 아닌 원래 "a"를 가리키는 주소 대신 새로 생긴 "ab"를 가리키는 주소가 a에 대입된다. 즉, 내용이 변경되는 것이 아니라 완전히 새로운 문자열을 생성하여 변수 a의 참조를 변경하는 것이다.

String 클래스의 주요 메소드

메소드 설명
char charAt(int index) 문자열에서 해당 위치에 있는 문자를 반환한다.
int length() 문자열의 길이를 반환한다.
String substring(int form, int to) 문자열에서 해당 범위의 문자열을 반환한다.(to는 포함되지 않음)
boolean equals(Object obj) 문자열의 내용이 같은지 확인한다.
char[] toCharArray() 문자열을 문자배열로 변환해서 반환한다.

substring에서 to를 생략하면 문자열의 끝까지 출력된다.

배열 출력

int[] arr = {0, 1, 2, 3, 4};
int[][] arr2D = {{11, 12}, {21, 22}};
System.out.println(Arrays.toString(arr));
System.out.println(Arrays.deepToString(arr2D));

[0, 1, 2, 3, 4]
[[11, 12], [21, 22]]

toString은 1차원, deepToString은 다차원에서 사용한다.

배열 비교

String[][] str2D = new String[][] {{"aaa", "bbb"}, {"AAA", "BBB"}};
String[][] str2D2 = new String[][] {{"aaa", "bbb"}, {"AAA", "BBB"}};
System.out.println(Arrays.equals(str2D, str2D2));
System.out.println(Arrays.deepEquals(str2D, str2D2));

false
true

equals는 1차원, deepEquals는 다차원에서 사용한다.

배열 복사

int[] arr = {0, 1, 2, 3, 4};
int[] arr2 = Arrays.copyOf(arr,  arr.length);
int[] arr3 = Arrays.copyOfRange(arr, 2, 4);
int[] arr4 = Arrays.copyOfRange(arr, 2, 7);
System.out.println(Arrays.toString(arr));
System.out.println(Arrays.toString(arr2));
System.out.println(Arrays.toString(arr3));
System.out.println(Arrays.toString(arr4));

[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4]
[2, 3]
[2, 3, 4, 0, 0]

copyOf()의 두 번째 인수는 복사할 요소의 갯수이다.
copyOfRange()는 from~to를 받는데 to는 포함되지 않는다. 또한 원래 배열의 크기를 넘어선 범위를 지정하면 0으로 채운다.

배열 정렬

int[] arr = {0, 8, 2, 6, 4};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));

[0, 2, 4, 6, 8]

오름차순으로 정렬된다.

객체지향 언어

코드의 재사용성이 높고 유지보수가 용이하다.
객체 지향 언어는 프로그래밍 언어에 객체지향 개념(규칙)을 추가한 것이다.

OOP(객체지향 프로그래밍)의 핵심 개념

  1. 캡슐화
  2. 상속
  3. 추상화
  4. 다형성

클래스와 객체

클래스의 정의 : 객체를 정의해 놓은 것을 말한다.
클래스의 용도 : 클래스는 객체를 생성하는데 사용한다.

객체의 정의 : 실제로 존재하는 것, 사물 또는 개념
객체의 용도 : 객체가 가지고 있는 기능과 속성에 따라 다름

객체의 구성요소

객체 = 속성(변수) + 기능(메소드)

// TV의 속성 : 크기, 길이, 높이, 색상, 볼륨, 채널 등
// TV의 기능 : 켜기, 끄기, 볼륨 조절, 채널 변경 등

class Tv{
    String color;
    boolean power;
    int channel;

    void poser() {power = !power;}
    void channelUp() {channel++;}
    void channelDown() {channel--;}
}

객체와 인스턴스

객체 : 모든 인스턴스를 대표하는 일반적 용어
인스턴스 : 특정 클래스로부터 생성된 객체

하나의 소스파일에 여러 클래스 작성

원래는 하나의 소스파일에 하나의 클래스가 맞음

public class가 있는 경우, 소스파일의 이름은 반드시 public class의 이름과 일치해야 한다.
public class가 하나도 없는 경우, 소스파일의 이름은 각 클래스명 중 아무거나 가능하다.

하나의 소스파일에 public class는 둘 이상 존재하면 안 된다.

객체의 생성

클래스명 변수명;
변수명 = new 클래스명();

Tv t;
t = new Tv();

클래스의 객체를 참조하기 위한 참조변수를 선언한다.
클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장한다.

객체의 사용

t.channel = 7;
t.channelDown();
System.out.println("현재 채널은 " + t.channel + " 입니다.");

하나의 인스턴스를 여러 개의 참조변수가 가리키는 경우는 가능하다.
하지만 여러 인스턴스를 하나의 참조변수가 가리키는 경우는 불가능하다.

객체 배열

객체 배열 == 참조변수 배열

Tv[] tvArr = new Tv[3];
Tv[] tvArr = { new Tv(), new Tv(), new Tv()};

초기화를 안하면 null 값이 들어가 있다.

클래스의 정의

클래스 == 데이터 + 함수

  1. 변수 : 하나의 데이터를 저장할 수 있는 공간
  2. 배열 : 같은 종류의 여러 데이터를 하나로 저장할 수 있는 공간
  3. 구조체 : 서로 관련된 여러 데이터(종류 관계X)를 하나로 저장할 수 있는 공간
  4. 클래스 : 데이터와 함수의 결함(구조체 + 함수)

사용자 정의 타입 : 원하는 타입을 직접 만들 수 있다.

선언위치에 따른 변수의 종류

클래스에는 클래스 영역과 메소드 영역이 있다.
변수가 선언된 위치가 클래스 영역이면 인스턴스 변수, 인스턴스 변수 앞에 static 키워드가 있으면 클래스 변수, 메소드 영역에 있으면 지역 변수가 된다.

클래스 영역에는 선언문만 가능하다.

변수의 종류 선언 위치 생성 시기
클래스 변수 클래스 영역 클래스가 메모리에 올라갈 때
인스턴스 변수 클래스 영역 인스턴스가 생성되었을 때
지역 변수 클래스 영역 이외의 영역
(메소드 생성자, 초기화 블럭 내부)
변수 선언문이 수행되었을 때

클래스 변수와 인스턴스 변수

포커 카드의 속성 : 무늬, 숫자, 폭, 높이 포커 카드를 객체라고 한다면 무늬, 숫자는 객체마다 다르게 유지되어야 하는 개별 값이고, 폭, 높이는 모든 객체가 공통적인 값이다.

개별 속성은 인스턴스 변수로, 공통 속성은 클래스 변수로 설정한다.

class Card {
    String kind;
    int number;

    static int width = 100;
    static int height = 250;
}
Card c = new Card();
c.kind = "HEART";
c.number = 5;
Card.width = 200;
Card.height = 300;

Card.width가 아니라 c.width를 해도 실행은 되지만 인스턴스 변수와 혼동할 수 있으므로 권장되지 않는다.

객체는 계속 만들면 인스턴스 변수는 늘어나지만 클래스 변수는 새로 생성되지 않는다.

import java.util.Arrays;

public class Ex2 {

	public static void main(String[] args) {
		System.out.println("Card.width = " + Card.width);
		System.out.println("Card.height = " + Card.height);
		
		Card c1 = new Card();
		c1.kind = "Heart";
		c1.number = 7;
		
		Card c2 = new Card();
		c2.kind = "Spade";
		c2.number = 4;
		
		System.out.println("c1 : " + c1.kind + "," + c1.number + " size : " + c1.width + ", " + c1.height);
		System.out.println("c2 : " + c2.kind + "," + c2.number + " size : " + c2.width + ", " + c2.height);
		System.out.println("c1의 width와 height를 각각 50, 80으로 변경");
		c1.width = 50;
		c1.height = 80;
		
		System.out.println("c2의 width와 height는 " + c2.width + "," + c2.height);
	}

}
class Card {
	String kind;
	int number;
	
	static int width = 100;
	static int height = 250;
}

Card.width = 100
Card.height = 250
c1 : Heart,7 size : 100, 250
c2 : Spade,4 size : 100, 250
c1의 width와 height를 각각 50, 80으로 변경
c2의 width와 height는 50,80

결과를 보고 알 수 있는 것

  • 클래스 변수는 객체를 만들지 않은 시점에도 확인할 수 있다.
  • 클래스 변수는 공통이어서 한쪽에서 변경하면 그 클래스의 객체는 모두 변경된다.

메소드

작업단위로 문장들을 묶어서 이름을 붙인 것

메소드는 클래스 안에 있어야 하고, 함수는 클래스에 독립적이다.

메소드의 장점

  • 코드의 중복을 줄일 수 있다.
  • 코드의 관리가 쉽다.
  • 코드를 재사용할 수 있다.
  • 코드가 간결해져 이해하기 쉬워진다.

메소드는 한 가지 기능만 수행하도록 작성하는 것이 좋다.

메소드 = 선언부 + 구현부

반환타입 메소드이름 (타입 변수명, 타입 변수명, ...)
{
    // 메소드 호출시 수행될 코드
}