https://wikidocs.net/images/page/206/03-6_array.png

 

배열은 수학에서 사용하는 배열을 프로그래밍적인 리스트의 형태로 구현한 것이다.

간단히 말하면, 엘범이라 생각하면 좋다. 여러가지 사진을 각각의 다른 페이지에 넣어서 저장하는 엘범처럼

배열도 각 변수를 하나의 상자안에 각각 넣어둔다. 

String[] weeks = {"월", "화", "수", "목", "금", "토", "일"};

 

실제 위는 변수 선언인데, 이 경우 ['월' 이란 사진]을 <0번째 상자>에 담고 ['화' 라는 사진]을 <1번째 상자>에 담고 ~~~~  ['일' 라는 사진]을 <6번째 상자>에 담은 { weeks 라는 엘범 }을 만든다는 의미이다.

더보기

더 정확한 CS 식 표현은 

  • weeks라는 이름의 String 타입의 배열을 선언한다
  • 배열 안에는 7가지의 문자를 추가한다
  • 각 문자는 하나의 연속된 메모리 공간에 데이터를 순서대로 저장한다
  • 문자는 각각의 인덱스를 부여받아 주소로서 접근이 가능하다

흔히 이 엘범에 해당하는 부분을 자료구조 라고 부른다.

 

+ 자료구조

  • 데이터를 효율적으로 저장하고 관리하는 방법으로 배열은 그 중에 하나의 형태일 뿐이다.
  • 컴퓨터 과학에서 효율적인 접근 및 수정을 가능케 하는 자료의 조직, 관리, 저장 이라 정의되어 있다...
  • 고정된 크기: 배열은 생성 시 크기가 고정되며, 데이터가 추가되거나 삭제되지 않는다.
  • 인덱스를 통한 접근: 각 데이터는 고유한 인덱스 번호로 접근할 수 있어 효율적인 데이터 조회가 가능합니다. 
    자료구조

생성

위에서 설명을 했지만, 세부적인 내용은 아래와 같다.

자료구조 배열

  1.  int 타입의 배열 array를 생성한다.
  2. 참조형 변수 처럼 new를 사용하여 int 정수 8개를 포함할 리스트를 생성한다.
  3. int로 타입을 지정한 만큼, 모든 리스트 내의 변수는 0으로 초기화 되어 있다.

+ int는 0, boolean 은 false, String 은 null 값과 같은 초기값이 정해져 있다.

+ new를 쓰는 이유는, heap에 메모리를 할당하고 초기화 해달라는 명령이다.('들어갈거니 자리만들어 달라' 는 말)

// 배열 생성

//배열 생성후 초기화하면 배열의 주소가 할당된다.
int[] intArray = new int[3]; // 초기값 {0,0,0}
boolean[] boolArray = new boolean[3]; // 초기값 {false, false, false}
String[] stringArray = new String[3]; // 초기값 {"","",""}
		
//배열 선언만 해놓고 나중에 초기화를 시킬수도 있다.
int[] intArray2;
intArray2 = new int[3]; // 초기값 {0,0,0}

 

 

초기화

  • 변수나 배열, 객체 등 메모리에 할당된 공간에 처음 값을 설정하는 과정을 말한다.
  • 초기화는 변수나 데이터 구조의 값이 예측 가능한 상태에서 작업을 시작할 수 있으므로, 에러를 줄이고 코드의 안정성을 높일 수 있다는 장점이 있다.

명시적 초기화

  • 사용자가 직접 값을 할당하여 초기화하는 방법
// 배열 초기화 

import java.util.Arrays; // Arrays 클래스를 import 해주세요!

public class Main {

	public static void main(String[] args) {
		//1. 배열에 특정값 대입하며 선언
		int[] intArray = {1, 2, 3, 4, 5};
		String[] stringArray = {"a", "b", "c", "d"};

		//2-1. for문을 통해 값을 대입
		for (int i = 0; i < intArray.length; i++) {
			intArray[i] = i;
		}

		//2-2. 향상된 for문을 통한 배열 출력
		for (int i : intArray) {
			System.out.print(i); // 01234
		}

		System.out.println(); // 줄바꿈

		//3. 배열의 주소를 모두 같은값으로 초기화
		Arrays.fill(intArray, 1);//배열의 모든 값을 1로 초기화

		for (int i : intArray) {
			System.out.print(i);  // 11111
		}
	}
}

// 출력
01234
11111

 

묵시적 초기화

  • 자바에서는 배열이나 객체의 멤버 변수는 자동으로 기본값으로 초기화된다. 위의 int의 0처럼 말이다.
int[] numbers = new int[5]; // int 배열의 모든 요소가 0으로 초기화됨
boolean[] flags = new boolean[3]; // boolean 배열의 모든 요소가 false로 초기화됨

 

생성자 초기화

  • 객체를 생성할 때, **생성자(Constructor)**를 통해 객체의 필드를 초기화할 수 있다.
public class Person {
    String name;
    int age;

    // 생성자를 이용한 초기화
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

Person person = new Person("홍길동", 25); // 객체 생성 시 생성자를 통한 초기화

 

 

순회

  • 배열안에 담겨있는 변수들을 하나씩 꺼내서 사용하는 것을 순회라고 합니다.
  • 이 순회도 정말 많은 방식이 존재한다 (부르트포스와 같은 완전탐색 부터 다양하다... 코테에서 자주 출몰한다...)
//길이가 8인 정수배열 선언
int[] intArray = new int[3];

// 배열이 초기화된 값을 출력해본다.
for(int i=0; i<intArray.length; i++) { // .length 는 배열의 길이
	System.out.println(intArray[i]);
}

// 출력
0
0
0

// int[] intArray = new int[3];
// intArray = {1,2,3}
// System.out.println(intArray[1]); 

// 결과 = 2

 

+ 추가로 .length()라는 메서드가 있는데 배열의 길이를 반환해준다. 위의 경우에 intArray.length()를 입력하면 배열 안에 변수가 3개이니 3이 입력된다.

 

복사

얕은 복사 참조형 변수인 배열은 heap에 실제 값이 저장되고 stack에 주소가 저장된다

얕은 복사는 = 을 사용하는 복사로, 실제 값이 저장되는 것이 아닌 주소를 공유하게 된다
깊은 복사 여기는 반대로 주소를 하나 더 생성한다 

즉, 자리를 1개 더 만든 것임으로 메모리를 더 차지한다.

 

분명 p, q라는 2개의 변수가 생성되었지만 실제 값은 100하나만 있고 p, q가 같은 100의 주소를 들고 있다. 다만 반대의 경우 100, 90이라는 값이 heap에 저장되었고 당연히 stack도 따로 생성된다.

 

// 얕은 복사

int[] a = { 1, 2, 3, 4 };
int[] b = a; // 얕은 복사

b[0] = 3; // b 배열의 0번째 순번값을 3으로 수정했습니다. (1 -> 3)

System.out.println(a[0]); // 출력 3  <- a 배열의 0번째 순번값도 3으로 조회됩니다. 




// 깊은 복사 메서드

// 1. clone() 메서드
int[] a = { 1, 2, 3, 4 };
int[] b = a.clone(); // 가장 간단한 방법입니다. 
// 하지만, clone() 메서드는 2차원이상 배열에서는 얕은 복사로 동작합니다!!



// 깊은 복사 메서드

import java.util.Arrays;

public class Main {
	public static void main(String[] args) {
		// 2. Arrays.copyOf() 메서드
		int[] a = { 1, 2, 3, 4 };
		int[] b = Arrays.copyOf(a, a.length); // 배열과 함께 length값도 같이 넣어줍니다.
	}
}

 

 

String 배열

// 선언 후 하나씩 초기화 할 수 있습니다.
String[] stringArray = new String[3];
stringArray[0] = "val1";
stringArray[1] = "val2";
stringArray[2] = "val3";

// 선언과 동시에 초기화 할 수 있습니다.
String[] stringArray1 = new String[]{"val1", "val2", "val3"};
String[] stringArray2 = {"val1", "val2", "val3"};

 

위의 int와 다르게 문자열의 배열이 선언되는 String은 위 처럼 프로그래머가 각 변수를 초기화할 수 있지만, 만약 초기화를 따로 하지 않으면 각 변수에 null 값이 저장된다.

+ 간혹 null이 0인줄 아는 사람들이 있던데, null은 엄밀히 말하면 완전히 비어있는 값을 말한다

+ 변수나 객체가 아무것도 가리키지 않거나 할당되지 않았을 때 흔히 null이 설정된다.

 

+ String = char[]??

  • 엄밀히 말하면 문자열( String )과 문자 배열( char[] )은 다르다.
  • String은 참조형 데이터, char은 기본 데이터 배열이다.

그래서 뭐가 다른가

더보기

 

  • 불변성:
    • String은 불변(immutable) 객체로 한 번 생성되면 수정할 수 없습니다. 대신 새로운 String 객체를 생성합니다.
    • char[]는 가변이어서 배열의 각 요소를 자유롭게 변경할 수 있습니다.
  • 메서드:
    • String은 문자열을 다루기 위한 다양한 메서드들이 내장되어 있습니다 (예: length(), substring(), toUpperCase(), equals() 등).
    • char[]는 기본 배열로만 동작하며, 문자 배열을 처리하려면 수동으로 루프를 돌거나 메서드를 작성해야 합니다.
  • 메모리:
    • String은 객체로 힙 메모리에서 관리되고, 문자열 리터럴을 사용하는 경우 String Pool에 저장될 수 있습니다.
    • char[]는 배열이므로 힙 메모리에 저장됩니다. 배열은 메모리에서 연속적으로 공간을 차지합니다.

 

 

실제 String에는 아래와 같은 다양한 기능이 추가적으로 존재한다.

메서드
응답값 타입
설명
length()
int
문자열의 길이를 반환한다.
charAt(int index)
char
문자열에서 해당 index의 문자를 반환한다.
substring(int from, int to)
String
문자열에서 해당 범위(from~to)에 있는 문자열을 반환한다. (to는 범위에 포함되지 않음)
equals(String str)
boolean
문자열의 내용이 같은지 확인한다. 같으면 결과는 true, 다르면 false가 된다.
toCharArray()
char[]
문자열을 문자배열(char[])로 변환해서 반환한다.
new String(char[] charArr)
String
문자배열(char[]) 을 받아서 String으로 복사해서 반환한다.

 

// String 기능 활용하기

String str = "ABCD";

// length()
int strLength = str.length();
System.out.println(strLength);  // 4 출력

// charAt(int index)
char strChar = str.charAt(2); // 순번은 0부터 시작하니까 2순번은 3번째 문자를 가리킵니다.
System.out.println(strChar);  // C 출력

// substring(int from, int to)
String strSub = str.substring(0, 3); // 0~2순번까지 자르기 합니다. (3순번은 제외)
System.out.println(strSub);  // ABC 출력

// equals(String str)
String newStr = "ABCD";  // str 값과 같은 문자열 생성
boolean strEqual = newStr.equals(str);
System.out.println(strEqual); // true 출력

// toCharArray()
char[] strCharArray = str.toCharArray(); // String 을 char[] 로 변환

// 반대로 char[] 를 String로 변환하는 방법
char[] charArray = {'A', 'B', 'C'};
String charArrayString = new String(charArray); // char[] 를 String 으로 변환

 

 

 

다차원 배열

  • 이름만 들어도 이게 뭔가 싶은 다차원 배열은 우리가 흔히 말하는 차원 개념과 동일하다
    다차원 배열

Rank 1의 경우 차원(axis)가 1개임으로 1차원 배열, Rank 3의 경우 차원(axis)가 3개임으로 3차원 배열이라 부른다. 어럽게 생각할 필요 없이

 

1 차원은 책 1개

2차원은 앨범 여러개를 담은 책장 1개

3차원은 책장 여러개를 담은 창고 1개

 

라고 보면 쉽다.

 

 

 

선언은 간단한데, 그냥 위와 같다.

 

// 반복문을 통한 초기화

int[][] array = new int[2][3]; // 최초 선언

for (int i = 0; i < array.length; i++) {
    for (int j = 0; j < array[i].length; j++) {
        arr[i][j] = 0;  // i, j 는 위 노란색 네모박스 안에있는 숫자를 의미하며 인덱스 라고 부릅니다.
    }
}

// 중괄호를 사용해 초기화

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

 

 

가변 배열

  • Java 프로그래밍에서는 2차원 배열을 생성할 때 열의 길이를 생략하여, 행마다 다른 길이의 배열을 요소로 저장할 수 있다.
  • 이렇게 행마다 다른 길이의 배열을 저장할 수 있는 배열을 가변 배열이라고 한다.
// 가변 배열

// 선언 및 초기화
int[][] array = new int[4][];
// 배열 원소마다 각기다른 크기로 지정 가능합니다.
array[0] = new int[3];
array[1] = new int[4];
array[2] = new int[5];
array[3] = new int[2];

// 중괄호 초기화할때도 원소배열들의 크기를 각기 다르게 생성 가능합니다.
int[][] array2 = {
    {10, 20},
    {10, 20, 30},
    {10, 20, 30, 40},
    {10, 20, 30, 40, 50},
    {10, 20}

};

 

  • 이보다 위의 차원은 int[][][] MultiArray = {{{1, 2}, {3, 4}}, {{5, 6}, {7, 8}}} 이런식으로 늘리면 된다. 보통 3차원까지만 사용한다.

 

 

오늘 문제

public class FindElement3DArray {
    public static void main(String[] args) {
        int[][][] array = new int[3][3][3];

        // 배열 초기화
        int value = 1;
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                for (int k = 0; k < 3; k++) {
                    array[i][j][k] = value++;
                }
            }
        }

        // 특정 값 찾기 (예: 15)
        int target = 15;
        boolean found = false;
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                for (int k = 0; k < 3; k++) {
                    if (array[i][j][k] == target) {
                        System.out.println("Found " + target + " at position (" + i + ", " + j + ", " + k + ")");
                        found = true;
                        break;
                    }
                }
                if (found) break;
            }
            if (found) break;
        }

        if (!found) {
            System.out.println(target + " not found in the array.");
        }
    }
}


// 결과 : Found 15 at position (1, 1, 2)

 

더보기

public class FindElement3DArray { // 클래스 선언: FindElement3DArray 클래스를 정의합니다.
    public static void main(String[] args) { // main 메서드: 프로그램이 실행될 시작 지점입니다.
        int[][][] array = new int[3][3][3]; // 3x3x3 크기의 3차원 배열을 선언합니다.

        // 배열 초기화
        int value = 1; // 배열에 채울 값의 초기값을 1로 설정합니다.
        // 3차원 배열의 모든 요소를 채우는 반복문입니다.
        for (int i = 0; i < 3; i++) { // 첫 번째 차원 (i) 반복: 3번 반복
            for (int j = 0; j < 3; j++) { // 두 번째 차원 (j) 반복: 3번 반복
                for (int k = 0; k < 3; k++) { // 세 번째 차원 (k) 반복: 3번 반복
                    array[i][j][k] = value++; // 현재 위치에 값(value)을 넣고, 값을 증가시킵니다.
                }
            }
        }

        // 특정 값 찾기 (예: 15)
        int target = 15; // 찾고자 하는 값(target)을 15로 설정합니다.
        boolean found = false; // 값을 찾았는지 여부를 저장할 변수입니다. 초기값은 false입니다.

        // 3차원 배열을 순차적으로 탐색하는 반복문입니다.
        for (int i = 0; i < 3; i++) { // 첫 번째 차원 (i) 반복
            for (int j = 0; j < 3; j++) { // 두 번째 차원 (j) 반복
                for (int k = 0; k < 3; k++) { // 세 번째 차원 (k) 반복
                    if (array[i][j][k] == target) { // 현재 위치의 값이 target과 같으면
                        System.out.println("Found " + target + " at position (" + i + ", " + j + ", " + k + ")"); // target 값을 찾았을 때 해당 위치를 출력합니다.
                        found = true; // 값을 찾았으므로 found를 true로 설정합니다.
                        break; // 내부 반복문을 종료합니다. (k 반복문)
                    }
                }
                if (found) break; // target을 찾았으면 j 반복문을 종료합니다.
            }
            if (found) break; // target을 찾았으면 i 반복문을 종료합니다.
        }

        // 값을 찾지 못한 경우
        if (!found) { // found가 여전히 false라면, target을 찾지 못한 경우입니다.
            System.out.println(target + " not found in the array."); // 찾지 못했다고 출력합니다.
        }
    }
}

 

'Back-End (Web) > JAVA' 카테고리의 다른 글

[JAVA] 객체지향 프로그래밍 & 다형성  (1) 2024.11.12
[JAVA] 참조형 자료구조 정리(LIST / STACK / QUEUE / SET / MAP)  (0) 2024.11.11
[JAVA] 반복문  (0) 2024.11.11
[JAVA] 조건문  (0) 2024.11.11
[JAVA] 연산자  (0) 2024.11.11

이전 글의 조건문과 다르게, 정말 기계 스러운 처리 방식도 존재한다. 기계의 발명은 사람이 하는 작업을 자동화 하고 반복되는 일을 대신하기 위해서 였다. 그 기능에 기반하여 나온 것이 바로 반복문이다.

 

단순히 정말 특정 코드를 반복해서 실행하는 간단한 코드이다. 예시로 for, while, do-while등이 존재하는데 이 3개의 대하여 알아보자

 

  • for 문
    • 특정 조건에 따라 연산을 반복해서 수행하고 싶을 때 사용하는 문맥입니다.
    • for (초기값; 조건문; 증가연산) { (연산) } 형태로 사용합니다.
    • 특정 조건은 초기값과 조건문을 통해서 정의합니다.
    • 반복할 때마다 값을 증가시키려면 증가연산을 정의합니다.
    • 초기값이 조건문을 만족할 때까지 (연산)을 수행하면서 회차마다 증가연산을 수행합니다.
// for 문

for(int i=0; i < 4; i++) { // 변수 i 값은 0 ~ 3 까지 반복
    System.out.println(i + "번째 출력"); // i 변수와 문자열 합치기
}

// 출력
0번째 출력
1번째 출력
2번째 출력
3번째 출력

 

  • 향상된 for 문
    • for 소괄호 안에 값이 3개나 들어가기 때문에 이걸 2개로 줄여주는 방법이 향상된 for문 입니다.
    • 향상된 for 문은 연속된 변수 목록을 출력할 때 쓰입니다.
    • for (변수 타입 변수 명 : 목록변수) { (연산) } 형태로 사용합니다.
    • 변수 타입 과 변수 명 은 for 문안에서 연산을 수행할 변수를 정의합니다.
    • 목록변수는 3,6,9,12,15 처럼 값여러개를 하나의 변수로 저장하고 싶을 때 사용합니다.
// 향상된 for 문

int[] numbers = {3,6,9,12,15};
for(int number: numbers) {
    System.out.print(number + " "); 
}

// 출력
3 6 9 12 15`

 

향상된 for문의 경우 리스트에서 [ 3, 6, 9, 12, 15 ]를 저장함과 동시에 변수 5개가 정의 되어 있음으로 증가연산과 같은 추가적인 계산이 필요 없게 되었다. 실제로 이해가 안될 수 있으니 아래의 코드를 참고해 보자

더보기
더보기

// 만약 기존 for 문으로 구현한다면?

int[] numbers = {3,6,9,12,15};
for(int i = 0; i < numbers.length; i++) { // 배열에 .length 를 붙이면 길이값이 응답됩니다.
    System.out.println(numbers[i]);
}

// 출력
3 6 9 12 15

 

  • while 문, do-while 문
    • for 문과 동일하게 특정 조건에 따라 연산을 반복해서 수행하고 싶을 때 사용하는 문맥입니다.
    • 다만, 초기값 없이 조건문만 명시하여 반복합니다.
    • while(조건문) { (연산) } 형태로 사용합니다. (while 문)
      • 위처럼 while 문으로 사용하면 조건문을 만족해야지만 연산이 반복 수행됩니다.
      • 한번 반복할 때마다 조건문을 체크해서 조건문이 불만족(false) 이면 반복을 중단합니다.
    • do { (연산) } while(조건문) 형태로도 사용합니다. (do-while 문)
      • 위처럼 do-while 문으로 사용하면 최초 1회 연산 수행 후 조건문을 체크하여 더 반복할지 결정합니다.
      • 반복하게 된다면 그 이후에는 한번 반복할 때마다 조건문을 체크해서 조건문이 불만족(false) 이면 반복을 중단합니다.
    • break 명령
      • break; 명령을 호출하면 가장 가까운 블럭의 for 문 또는 while 문을 중단합니다. (또는 switch)
      • 반복문 안에서 break; 형태로 사용합니다.
    • continue 명령
      • for 문 또는 while 문에서 해당 순서를 패스하고 싶을 때 continue 명령을 사용합니다.
      • 반복문 안에서 continue; 형태로 사용합니다.
public class LoopExample {
    public static void main(String[] args) {
        int num = 1;

        // while 문을 사용하여 1부터 10까지의 숫자 출력
        while (num <= 10) {
            if (num % 2 == 0) {
                // 짝수일 경우 continue로 건너뜁니다. (아래의 println~num++까지 전부 스킵)
                num++;
                continue;
            }

            System.out.println("while loop, num = " + num);

            if (num == 7) {
                // num이 7일 때 반복 종료
                break;
            }

            num++;
        }

        System.out.println("End of while loop");

        // do-while 문을 사용하여 최소 1회 실행 후 조건 확인
        int doNum = 10;
        do {
            System.out.println("do-while loop, doNum = " + doNum);
            doNum--;
        } while (doNum > 5);

        System.out.println("End of do-while loop");
    }
}

// 결과
// while loop, num = 1
// while loop, num = 3
// while loop, num = 5
// while loop, num = 7
// End of while loop
// do-while loop, doNum = 10
// do-while loop, doNum = 9
// do-while loop, doNum = 8
// do-while loop, doNum = 7
// do-while loop, doNum = 6
// End of do-while loop

 

이해를 돕기 위해 설명하면,

 

  • while 루프 부분:
    • num이 1일 때 출력한 후 num++를 통해 num이 2가 됩니다.
    • num이 2일 때는 num++실행 후 (num=3) continue가 실행되어 건너뛰고 다음 반복으로 넘어갑니다.
    • num이 3이되고 println을 만나 'num = 3'이 입력됩니다.
    • 위의 3과정이 반복됩니다.
    • 이 과정이 반복되어 num이 7일 때 break로 인해 while 루프가 종료됩니다.
  • do-while 루프 부분:
    • doNum이 10일 때 최초 출력하고, 이후 doNum--를 통해 9, 8, 7, 6으로 감소하면서 반복됩니다.
    • doNum이 5보다 작아지면 조건에 따라 do-while 루프가 종료됩니다.

 

 

 

이를 실제로 응용하면 아래와 같이 돌아간다

// 선택적 구구단 생성기

Scanner sc = new Scanner(System.in);
int passNum = sc.nextInt(); // 출력제외할 구구단수 값
for (int i = 2; i <= 9; i++) {
	if (i == passNum) {
		continue;
	}
	for (int j = 2; j <= 9; j++) {
		System.out.println(i + "곱하기" + j + "는" + (i * j) + "입니다.");
	}
}

// 입력
2

// 출력 - 입력값인 2단은 건너띄고 구구단 출력
3곱하기2는6입니다.
3곱하기3는9입니다.
3곱하기4는12입니다.
... 중략 ...
9곱하기8는72입니다.
9곱하기9는81입니다.

 

'Back-End (Web) > JAVA' 카테고리의 다른 글

[JAVA] 참조형 자료구조 정리(LIST / STACK / QUEUE / SET / MAP)  (0) 2024.11.11
[JAVA] 배열  (0) 2024.11.11
[JAVA] 조건문  (0) 2024.11.11
[JAVA] 연산자  (0) 2024.11.11
[JAVA] 변수와 변수 종류  (0) 2024.11.11

간단히 프로그램은 인간이 하는 말을 단조로운 언어로 번역해 기기에게 설명해 주는 것이라 말할 수 있다. 즉 프로그램이란 현실이나 이상을 구현하는 작업임으로, 그 체계는 인간의 언어를 기반으로 한다.

 

흔히 일상 생활에서 '~하면 ~하지' 와 같은 만약의 의미를 담는 조건문을 사용하는 경우가 많다. 어찌 보면 하나의 템플릿 처럼 사용될 정도로 자주 사용하는 문장인 만큼 프로그램에도 이 조건문을 정의해 두었다.

  • if(조건)
    • 특정 조건에 따라 다른 연산을 수행하고 싶을 때 사용하는 문맥입니다.
    • 기본적인 조건에 따른 연산을 수행하기 위해 if(조건) { 연산 } 형태로 사용합니다.
    • if의 소괄호() 안의 조건이 boolean 값 true를 만족하면 중괄호 {} 안의 연산을 수행합니다.
  • if(조건)-else if(조건)
    • if문 조건이 거짓일 경우에 다시 한번 다른 조건으로 체크해서 참일 경우에 연산을 수행하기 위해 else if(조건) { 연산 } 형태로 사용합니다.
    • else if의 소괄호() 안의 조건이 boolean 값 true를 만족하면 else if의 중괄호 {} 안의 연산을 수행합니다.
  • if(조건)-else
    • if문 조건이 거짓일 경우에 따른 연산을 수행하기 위해 else { 연산 } 형태로 사용합니다.
    • if의 소괄호() 안의 조건이 boolean 값 false를 만족하면 else의 중괄호 {} 안의 연산을 수행합니다
// 조건문으로 가위바위보 만들기

import java.util.Objects;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		System.out.print("A 입력 : ");
		String aHand = sc.nextLine(); // A 입력

		System.out.print("B 입력 : ");
		String bHand = sc.nextLine(); // B 입력

		if (Objects.equals(aHand, "가위")) { // 값을 비교하는 Obects.equals() 메서드 사용
			if (Objects.equals(bHand, "가위")) {
				System.out.println("A 와 B 는 비겼습니다."); // A 와 B 의 입력값을 비교해서 결과 출력
			} else if (Objects.equals(bHand, "바위")) {
				System.out.println("B 가 이겼습니다.");
			} else if (Objects.equals(bHand, "보")) {
				System.out.println("A 가 이겼습니다.");
			} else {
				System.out.println(" B 유저 값을 잘못 입력하셨습니다.");
			}
		} else if (Objects.equals(aHand, "바위")) {
			if (Objects.equals(bHand, "가위")) {
				System.out.println("A 가 이겼습니다.");
			} else if (Objects.equals(bHand, "바위")) {
				System.out.println("A 와 B 는 비겼습니다.");
			} else if (Objects.equals(bHand, "보")) {
				System.out.println("B 가 이겼습니다.");
			}
		} else if (Objects.equals(aHand, "보")) {
			if (Objects.equals(bHand, "가위")) {
				System.out.println("B 가 이겼습니다.");
			} else if (Objects.equals(bHand, "바위")) {
				System.out.println("A 가 이겼습니다.");
			} else if (Objects.equals(bHand, "보")) {
				System.out.println("A 와 B 는 비겼습니다.");
			}
		}

	}
}

// 입/출력 예시
// A 입력 : 가위
// B 입력 : 보
// A 가 이겼습니다.
  • if = ~하면 ~하지 = 조건문
  • else = 만약에 그게 아니면 ~하자 = 조건외
  • else = 만약에 ~가 아니면 ~이지 않을까? = 꼬리 물기 조건

그런데 이거 너무 긴거 아닐까? 라는 생각이 든다. 현실에서도 조건에 부차적인 조건이 붙는 경우는 많다. "꽃 10송이 사와, 10송이 없으면 5송이만 사와" 이런 것처럼 말이다. 이를 좀 더 간결하게 사용하기 위해 만들어진 메소드가 switch이다.

 

switch

  • 여러 경우의 수 중 하나를 선택해야 할 때 사용하는 제어문입니다.
    • switch(피연산자) { case(조건): (연산) } 이러한 형태로 많이 쓰입니다.
    • switch 피연산자가 case 조건을 만족하면 case: 뒤에 명시되어 있는 연산을 수행합니다.
    • case(조건): (연산) 은 여러 개를 설정할 수 있습니다.
      • 🔎 각 case의 연산문 마지막에는 break;를 꼭 넣어줘야 합니다!!
      • break; 문은 해당 case의 연산문이 끝났다는 것을 알려주어 switch 문을 종료시켜줍니다.
      • 즉 break가 없으면, switch의 모든 조건을 다 한번씩 실행해본다.
    • switch문 중괄호 안의 제일 마지막에 default: (연산) 을 명시해 주어 case 조건들이 모두 만족하지 않을 때 수행할 연산을 정해주어야 합니다.
      • default: (연산) 은 아무것도 만족하지 않을 때 수행하는 것이라, 없다면 생략해도 됩니다.
// if vs switch
// switch 문 실습코드를 if 문으로 바꿔보겠습니다.

// switch 
int month = 8;
String monthString = "";
switch (month) {
    case 1:  monthString = "1월";
             break;
    case 2:  monthString = "2월";
             break;
    case 3:  monthString = "3월";
             break;
    case 4:  monthString = "4월";
             break;
    case 5:  monthString = "5월";
             break;
    case 6:  monthString = "6월";
             break;
    case 7:  monthString = "7월";
             break;
    case 8:  monthString = "8월"; 
             break;
    case 9:  monthString = "9월";
             break;
    case 10: monthString = "10월";
             break;
    case 11: monthString = "11월";
             break;
    case 12: monthString = "12월";
             break;
    default: monthString = "알수 없음";
}
System.out.println(monthString); // 8월 출력

// if 로 변환
if (month == 1) {
	monthString = "1월";
} else if (month == 2) {
	monthString = "2월";
} else if (month == 3) {
	monthString = "3월";
} else if (month == 4) {
	monthString = "4월";
} else if (month == 5) {
	monthString = "5월";
} else if (month == 6) {
	monthString = "6월";
} else if (month == 7) {
	monthString = "7월";
} else if (month == 8) {
	monthString = "8월";
} else if (month == 9) {
	monthString = "9월";
} else if (month == 10) {
	monthString = "10월";
} else if (month == 11) {
	monthString = "11월";
} else if (month == 12) {
	monthString = "12월";
} else {
	monthString = "알수 없음";
}
System.out.println(monthString); // 8월 출력

 

 

그렇다고 모든 상황에서 if보다 switch가 좋은 것은 아니다.

 

switch는 각 조건에 추가 꼬리 조건이 달릴 수 없지만 if는 가능하다.

if (Objects.equals(aHand, "가위")) { // 값을 비교하는 Obects.equals() 메서드 사용
	if (Objects.equals(bHand, "가위")) {
		System.out.println("A 와 B 는 비겼습니다."); // A 와 B 의 입력값을 비교해서 결과 출력
	}
            
            
            switch (month) {
    case 1:  monthString = "1월";
             break;
    case 2:  monthString = "2월";
             break;
    case 3:  monthString = "3월";

    default: monthString = "알수 없음";
}

 

보면 if는 조건에 조건을 추가할 수 있지만, switch는 조건마다 1개의 조건만 추가할 수 있다.

 

즉, 각 조건문은 각자의 장점이 있고 때에따라 다른 조건문을 사용하는 것이 좋다.

 

'Back-End (Web) > JAVA' 카테고리의 다른 글

[JAVA] 배열  (0) 2024.11.11
[JAVA] 반복문  (0) 2024.11.11
[JAVA] 연산자  (0) 2024.11.11
[JAVA] 변수와 변수 종류  (0) 2024.11.11
[JAVA] 자바 개발을 위한 준비물 IntelliJ  (0) 2024.11.11

연산자와 피연산자

계산할 때 계산의 대상이 되는 것이 피연산자 이며, 계산의 목적이 되는 것이 연산자입니다.

  • 연산자 : 덧셈, 뺄셈처럼 계산할 기호
  • 피연산자 : 연산자로 인해 계산되는 숫자 🔢

연산자 종류

연산자 종류 대

 

산술~논리 연산자는 비교적 간단히 설명이 가능하다

  • +(덧셈), - (뺄셈), *(곱셈), /(나눗셈/몫), % (나눗셈/나머지)
  • > (크다) , < (작다), >= (크거나 같다), <= (작거나 같다), == (같다), != (다르다)
  • && (AND = 피연산자 모두 참), ||(OR = 피연산자 둘 중 하나라도 참), !(피연산자의 반대 boolean 값)

대입 연산자

  • 변수를 바로 연산해서 그 자리에서 저장하는 연산자
// 대입 연산자
int number = 10;
number = number + 2;
System.out.println(number); // 12

 

+ 복합 대입 연산자 (+=, -=, *= …)

// 복합 대입 연산자
number = 10;
number += 2;
System.out.println(number); // 12

 

위 코드와 아래 코드는 실재로 같은 말이다. 다만 좀 더 짧게 코드를 짜기위해 아래와 같은 형태도 만들어졌다.

 

🔥 대입 연산자 중에 증감 연산자 쓸 때 주의할 점!

  • ++ 또는 —-를 붙이면 피연산자가 1 더해지거나 1 빼기가 된다.
  • 주의할 점은, 피연산자 뒤에 붙이냐, 앞에 붙이냐에 따라서 연산 순서가 달라진다.

연산자 연산자 위치 기능 연산 예 (num=1일 경우)

++ 변수 ++{피연산자} 연산 전에 피연산자에 1 더해줍니다. val = ++num;
num값+1 후에 val변수에 저장 = val =2
변수 ++ {피연산자}++ 연산 후에 피연산자에 1 더해줍니다. val = num++;
num값을 val변수에 저장 후 num+1 = val = 1
- - 변수   —{피연산자} 연산 전에 피연산자에 1 빼줍니다. val = —num;
num값-1 후에 val변수에 저장 = val = 0
변수 - - {피연산자}— 연산 후에 피연산자에 1 빼줍니다. val = num—;
num값을 val변수에 저장 후 num-1 = val =1
  • 이처럼 대입 연산할 때뿐만 아니라 연산을 직접 할 때도 마찬가지로 선/후 적용이 나뉜다. 
  • 연산자 우선순위 : 산술 > 비교 > 논리 > 대입
  • 단, 괄호로 감싸주면 괄호 안의 연산이 최우선 순위로 계산
// 연산자 우선순위
int x = 2;
int y = 9;
int z = 10;

boolean result = x < y && y < z; // <,> 비교연산자 계산 후 && 논리 연산자 계산
System.out.println(result); // true

result = x + 10 < y && y < z; // +10 산술연산자 계산 후 <,> 비교연산자 계산 후 && 논리 연산자 계산
System.out.println(result); // false

result = x + 2 * 3 > y; // 산술연산자 곱센 > 덧셈 순으로 계산 후 > 비교연산자 계산
System.out.println(result); // false (8>9)

result = (x + 2) * 3 > y; // 괄호안 덧셈 연산 후 괄호 밖 곱셈 계산 후 > 비교연산자 계산
System.out.println(result); // true (12>9)

 

 

기타 연산자

  • 형변환 연산자
// 형변환 연산자
int intNumber = 93 + (int) 98.8; // 93 + 98

double doubleNumber = (double) 93 + 98.8; // 93.0 + 98.8

이전 글에 설명한 형변환에 관련된 내용이다. (간단한 설명으로 int는 정수만, double은 실수만을 반환할 수 있다.)

  • 삼항 연산자
  • 비교 연산의 결과값에 따라 응답할 값을 직접 지정할 수 있는 연산자입니다.
  • (조건) ? (참 결과) : (거짓 결과)
// 삼항 연산자
int x = 1;
int y = 9;

boolean b = (x == y) ? true : false;
System.out.println(b); // false

String s = (x != y) ? "정답" : "땡";
System.out.println(s); // 땡

int max = (x > y) ? x : y;
System.out.println(max); // 9

int min = (x < y) ? x : y;
System.out.println(min); // 1

 

  • instance of 연산자
  • 피연산자가 조건에 명시된 클래스의 객체인지 비교하여 참/거짓을 응답해 주는 연산자
  • (객체명) instance of (클래스명)
class Car {}

public class TestInstanceof {
    public static void main(String[] args) {
        Car car = new Car();
        String str = "Hello";

        System.out.println(car instanceof Car); // true
        System.out.println(str instanceof String); // true
        System.out.println(car instanceof String); // false
    }
}

 

  • car instanceof Car → true. car는 Car 클래스의 인스턴스( 객체 )이기 때문에.
  • str instanceof String → true. str은 String 클래스의 인스턴스 ( 객체 ) 이기 때문에.
  • car instanceof String → false. car는 String 클래스의 인스턴스 ( 객체 ) 가 아니므로 false.

연산 주의 사항

📌 연산 전에 피연산자의 타입을 일치시키는 것

  • 두 피연산자의 타입을 같게 일치시킨다. (둘중에 저장공간 크기가 더 큰 타입으로 일치) 
더보기
  • 피연산자의 타입이 int 보다 작은 short 타입이면 int로 변환
  • 피연산자의 타입이 long 보다 작은 int, short 타입이면 Long으로 변환
  • 피연산자의 타입이 float보다 작은 long, int, short 타입이면 float으로 변환
  • 피연산자의 타입이 double 보다 작은 float, long, int, short 타입이면 double으로 변환

 

비트 연산

  • Byte를 8등분 한 게 Bit
  • Bit는 0,1 둘 중의 하나의 값만을 저장하는 컴퓨터가 저장(표현) 가능한 가장 작은 단위
  • 컴퓨터의 가장 작은 단위인 Bit이기 때문에 연산중에서 Bit 연산이 제일 빠르다
  • 물론 이전에 배운 대로 0,1 값으로 산술연산을 하거나, 비교 연산을 할 수 있지만 비트 연산을 통해 자릿수를 옮길 수도 있다.
  • 이처럼 Bit의 자릿수를 옮기는 것을 비트 연산이라고 한다.
  • <<(왼쪽으로 자릿수옮기기), >>(오른쪽으로 자릿수옮기기)
  • 0,1 은 2진수 값이기 때문에,
    • 자릿수를 왼쪽으로 옮기는 횟수만큼 2의 배수로 곱셈이 연산되는 것과 동일하다.
    • 자릿수를 오른쪽으로 옮기는 횟수만큼 2의 배수로 나눗셈이 연산되는 것과 동일하다.
// 비트 연산

// 참고, 3의 이진수값은 11(2) 입니다. 12의 이진수값은 1100(2) 입니다.
// (2) 표기는 이 숫자가 이진수값이라는 표식 입니다.

System.out.println(3 << 2); 
// 3의 이진수값인 11(2) 에서 왼쪽으로 2번 옮겨져서 1100(2) 인 12값이 됩니다.


System.out.println(3 >> 1); 
// 3의 이진수값인 11(2) 에서 오른쪽으로 1번 옮겨져서 1(2) 인 1 값이 됩니다.

 

'Back-End (Web) > JAVA' 카테고리의 다른 글

[JAVA] 반복문  (0) 2024.11.11
[JAVA] 조건문  (0) 2024.11.11
[JAVA] 변수와 변수 종류  (0) 2024.11.11
[JAVA] 자바 개발을 위한 준비물 IntelliJ  (0) 2024.11.11
[JAVA] JVM은 뭘까?  (1) 2024.11.11

변수는 상자

 

프로그래밍에서 변수는 데이터를 저장하는 "이름이 있는 저장 공간"이다. 프로그램 실행 중에 특정 값을 저장하고, 필요할 때마다 그 값을 쉽게 불러오거나 변경할 수 있다.(상수는 변수와 비슷하지만 값이 변경이 안된다는 특징이 있다.)

 

int number; // number 라는 이름의 int(숫자)타입의 저장공간을 선언
String name; // name 이라는 이름의 String(문자열)타입의 저장공간을 선언

 

 

위의 상자 예시를 기준으로

  • int는 상자의 종류(골판지인지 플라스틱인지)
  • number는 상자 앞에있는 myNum처럼 닉네임
  • 10은 상자에 저장할 값이다.
final int number = 10; // 1. 상수로 선언 (데이터 타입 앞에 final 을 붙이면 됩니다.)

 

+ 상수는 위와 같이 선언하면 된다.

 

 

변수는 크게 3가지의 형태가 존재한다.

기본형 변수 기본형 변수는 실제 데이터 값을 직접 저장하는 간단한 형태의 변수 (여긴 stack 자체에 값이 저장된다.)
[ int, char, boolean ]
참조형 변수 참조형 변수는 데이터가 저장된 메모리 주소를 참조 (여긴 stack에 주소, heap에 값이 저장된다.)
[ String, ArrayList, MyClass ]
래퍼 클래스 변수 기본형 변수를 객체로 다룰 수 있도록 감싸주는 클래스

 

+ 알아두면 좋은 상식 : 기본형 변수는 소문자로 참조형은 대문자로 시작한다

 1. 기본형 변수 (Primitive Type)
기본형 변수는 실제 데이터 값을 직접 저장하는 간단한 형태의 변수입니다. Java에서는 8가지 기본형이 있으며, 대표적인 예시는 아래와 같습니다.

#### 논리형 (boolean)
- **`boolean`**: 참(true) 또는 거짓(false)만 저장할 수 있습니다.

  boolean flag = true;



#### 문자형 (char)
- **`char`**: 하나의 문자만 저장합니다. 작은 따옴표('')로 문자를 감싸서 사용합니다.

  char alphabet = 'A';

 

  • 문자 (char)
    • 문자 뒤에 \0(널문자)가 없습니다. (1 byte만 쓰기 때문에 끝을 알아서 데이터만 저장하면 됩니다.)
  • 문자열 (String)
    • 문장의 끝에 \0(널문자=빈공간)가 함께 저장이 됩니다. (몇 개의 byte를 쓸지 모르기 때문에 끝을 표시해야 합니다.)


#### 정수형 (byte, short, int, long)
- **정수형**은 정수를 저장하며, 사용할 범위에 따라 다양한 타입을 제공합니다.
  - **`byte`**: -128 ~ 127
  - **`short`**: -32,768 ~ 32,767
  - **`int`**: -2,147,483,648 ~ 2,147,483,647
  - **`long`**: 매우 큰 수 범위, 숫자 뒤에 **`L`**을 붙여 표기

 

  int number = 2147483647;
  long largeNumber = 9223372036854775807L;



#### 실수형 (float, double)
- **실수형**은 소수점을 가진 실숫값을 저장합니다. 사용 범위에 따라 `float`와 `double`로 나뉩니다.
  - **`float`**: 소수점 이하 약 7자리까지 저장 가능, 숫자 뒤에 **`f`**를 붙여 표기
  - **`double`**: 소수점 이하 약 16자리까지 저장 가능

  float decimal = 3.14f;
  double largeDecimal = 3.141592653589793;



---

2. 참조형 변수 (Reference Type)
참조형 변수는 데이터가 저장된 메모리 주소를 참조합니다. 참조형 변수의 주요 종류는 다음과 같습니다.

= 기본형 변수와 다르게 상자에 물건을 직접 담는게 아니라 물건이 있는 주소를 상자에 넣는다는 것이다.

  • 기본형 변수 : 원본 값이 Stack 영역에 있다.
  • 참조형 변수 : 원본 값이 Heap 영역에 있다.
  • Stack 영역에는 따로 저장 해둔 원본 값의 Heap 영역 주소를 저장합니다.
  • 주소값(객체 위치, 변수 위치)을 저장하는 변수


#### 문자열 (String)
- **`String`**: 여러 문자를 조합한 문자열을 저장합니다. 큰 따옴표("")로 감싸서 사용합니다.

  String message = "Hello World";

= String은 message라는 상자에 "Hello World"를 넣는 것이 아닌 Hello World가 저장된 주소를 저장한다.

 

  • "Hello World"라는 문자열이 메모리의 힙 영역에 저장됩니다.
  • 변수 message는 스택 영역에 저장되고, 이 변수는 "Hello World"가 있는 메모리 위치를 참조(가리키는)합니다.
  • 이렇게 message 변수를 사용하면 "Hello World"가 있는 위치로 접근할 수 있게 됩니다.



#### 객체, 배열, 리스트 (Object, Array, List 등)
- 다양한 형태의 데이터나 객체들을 저장하는 변수 타입입니다.

 

  int[] numbers = {1, 2, 3}; // 배열 예시



---

3. 래퍼 클래스 변수 (Wrapper Class)
기본형 변수를 객체로 다룰 수 있도록 감싸주는 클래스입니다. 예를 들어, `int` 기본형 변수는 `Integer` 래퍼 클래스로 사용할 수 있습니다. Java의 객체지향 기능을 활용할 때 유용합니다.

// 박싱 VS 언박싱

// 박싱
// Integer 래퍼 클래스 num 에 21 의 값을 저장
int number = 21;
Integer num = new Integet(number);

// 언박싱
int n = num.intValue(); // 래퍼 클래스들은 inValue() 같은 언박싱 메서드들을 제공해줍니다.
  • 박싱 VS 언박싱
    • 기본 타입에서 래퍼 클래스 변수로 변수를 감싸는 것을 “박싱”이라고 부르며
    • 래퍼 클래스 변수를 기본 타입 변수로 가져오는 것을 “언박싱”이라고 부릅니다.

래퍼 클래스 변수

 

 

변수형 변환

  • 형변환에 대한 이해
    • Java 프로그래밍을 하다 보면 문자열로 입력받은 변수를 숫자로 변환해서 계산을 하고 싶은 경우, 문자열에 숫자 값을 추가하고 싶은 경우 등… 어떤 변수형을 다른 형으로 변환이 필요한 경우가 많습니다.
    • 형변환은 주로 기본형 변수인 정수 ↔ 실수 ↔ 문자 들 사이에서 일어나며 방법은 아래와 같습니다.
  • 정수형, 실수형 간 발생하는 형변환
    • Double, Float to Int
    • (Int) 캐스팅 방식으로 실수를 정수로 치환하는 방법입니다.
    • 이때 실수형의 소수점 아래 자리는 버려집니다.
    •  
double doubleNumber = 10.101010;
float floatNumber = 10.1010

int intNumber;
intNumber = (int)doubleNumber; // double -> int 형변환
intNumber = (int)floatNumber; // float -> int 형변환
  • Int to Double, Float
  • (Double, Float) 캐스팅으로 정수형을 실수형으로 변환하는 방법입니다.
int intNumber = 10;

double doubleNumber = (double)intNumber; // int -> double 형변환
float floatNumber = (float)intNumber;  // int -> float 형변환

 

  • 자동 형변환
    • Java 프로그래밍에서 형변환을 직접적으로 캐스팅하지 않아도 자동으로 형변환 되는 케이스가 있습니다.
    • 프로그램 실행 도중에 값을 저장하거나 계산할 때 자동으로 타입 변환이 일어납니다.

1) 자동 타입 변환은 작은 크기의 타입에서 큰 크기의 타입으로 저장될 때 큰 크기로 형변환이 발생합니다.

    • 더보기

      📌 변수 타입별 크기 순서

      byte(1) → short(2) → int(4) → long(8) → float(4) → double(8)

byte byteNumber = 10;
int intNumber = byteNumber;    // byte -> int 형변환
System.out.println(intNumber); // 10

char charAlphabet = 'A';
intNumber = charAlphabet;   // char -> int 형변환
System.out.println(intNumber); // A의 유니코드 : 65

intNumber = 100;
long longNumber = intNumber; // int -> number 형변환
System.out.println(longNumber); // 100

intNumber = 200;
double doubleNumber = intNumber; // int -> double 형변환
System.out.println(doubleNumber); // 200.0  (소수점이 추가된 실수출력)

 

2) 작은 크기의 타입이 큰 크기의 타입과 계산될 때 자동으로 큰 크기의 타입으로 형변환이 발생합니다.

int intNumber = 10;
double doubleNumber = 5.5;
double result = intNumber + doubleNumber; // result 에 15.5 저장됨 (int -> double)

intNumber = 10;
int iResult = intNumber / 4; // iResult 에 2 저장됨 (int형 연산 -> 소수점 버려짐)

intNumber = 10;
double dResult = intNumber / 4.0; // dResult 에 2.5 저장됨 (double형 연산 -> 소수점 저장)
  • 🔥 자동 형변환 vs 강제 형변환
    • 작은 타입 > 큰 타입 형변환 시 (자동 형변환)
      • 더 큰 표현 범위를 가진 타입으로 변환되는 것이라 값의 손실이 없습니다.
      • 값의 손실 없이 변환이 가능하기 때문에 컴파일러가 자동으로 형변환을 해줍니다.
    • 큰 타입 > 작은 타입 형변환 시 (강제 형변환 = 캐스팅)
      • 더 작은 표현 범위를 가진 타입으로 변환된는 것이라 값의 손실이 생깁니다.
      • 값의 손실이 생기기 때문에 자동으로 형변환을 해주지 않고 개발자가 선택하여 형변환을 합니다. 

 

 

+ 비트&바이트

비트(Bit)와 바이트(Byte)는 컴퓨터에서 데이터의 가장 작은 단위로, 모든 디지털 데이터는 이 단위로 이루어져 있습니다.

Byte(바이트)는 8개의 Bit(비트)로 구성되어 있습니다.

  • Bit
    • Bit(비트)는 0,1 형태의 2진수 데이터로써 컴퓨터가 저장(표현) 할 수 있는 최소 단위입니다.
    • 정수형 값은 10진수 숫자(0~10범위의 숫자)이며 2진수(0~1범위) Bit로 저장(표현) 합니다.
    • 4개의 Bit로 16진수 숫자(0~F(16) 범위의 숫자)를 2진수(0~1범위) Bit로 저장(표현) 합니다.
    • 2진수(0~1)를 10진수, 16진수로 변환된 값 예시
  • Byte = 8 Bit
    • Byte(바이트)는 8개의 Bit(비트)로 구성되어 있습니다.
    • 1 Byte 내에서 숫자 변수는 Bit 2진수를 10진수로 저장(표현)을 합니다.
      • 10진수로는 0~255(2의8승)까지 저장(표현) 합니다.
    • 1 Byte 내에서 문자 변수의 경우만 Bit 2진수를 16진수로 저장(표현) 합니다.

 

'Back-End (Web) > JAVA' 카테고리의 다른 글

[JAVA] 조건문  (0) 2024.11.11
[JAVA] 연산자  (0) 2024.11.11
[JAVA] 자바 개발을 위한 준비물 IntelliJ  (0) 2024.11.11
[JAVA] JVM은 뭘까?  (1) 2024.11.11
[JAVA] 자바란 무엇일까?  (0) 2024.10.31

IntelliJ

 

IntelliJ는 JetBrains에서 개발한 강력한 통합 개발 환경(IDE)으로, 특히 **Java 개발**에 최적화되어 있지만, 다양한 프로그래밍 언어와 프레임워크를 지원한다. IntelliJ IDEA(이하 IntelliJ)는 코드 작성부터 디버깅, 테스트, 배포까지 개발 과정 전반에 걸쳐 다양한 기능을 제공하여, 개발 생산성을 높이는 데 큰 도움을 준다.

말이 어려워 보이지만, 프로그램이라는 그림을 그리기 위해 필요한 그림판이라고 보면된다. 다만 여러가지 유용한 기능이 있어 그림판 보다는 태블릿에 가깝다고 생각하면 좋다.

 

과거에는 이클립스라는 프로그램이 많이 사용되었지만 다양한 편의성과 기능으로 현재는 대부분의 웹 개발자가 IntelliJ를 사용하고 있다.

 

 

  • Java 프로그램(앱)의 시작점!
    • Java 앱은 실행되면 제일 먼저 클래스의 main 메서드를 실행시키는 게 JVM의 약속이다.
    • 단순히 main이라는 박스를 만들어서 이제부터 이 박스안에 원하는 프로그램을 만들거다 라는 것
public class Main {
	public static void main(String[] args) {
		System.out.println("Hello world!");
	}
}


### 클래스 정의
- **`public class Main { }`**
  - `public`: 다른 곳에서도 사용할 수 있도록 클래스 접근을 허용하는 접근 제어자.

  -  접근 제어자 : 클래스, 메서드, 변수 등 특정 코드 요소에 대한 접근 권한 
  - `class`: 객체(데이터와 기능의 묶음)를 만들기 위한 선언.
  - `Main`: 클래스 이름. Java에서는 파일명과 같아야 함. 컴파일 후 `.class` 파일을 생성할 때 이름을 맞춰주기 위해 필요.

### 메인 메서드 정의
- **`public static void main(String[] args)`**
  - `public`: 다른 곳에서 이 메서드를 실행할 수 있게 함.
  - `static`: 프로그램 시작 시 한 번만 실행되는 메서드. 다른 `static` 메서드나 변수만 호출 가능.
  - `void`: 메서드가 값을 반환하지 않음을 의미.
  - `main`: 프로그램 시작점이 되는 메서드. Java 프로그램은 항상 `main` 메서드부터 시작.

### 메서드 매개변수
- **`(String[] args)`**
  - `String[]`: 문자열들의 배열, 즉 여러 개의 문자열을 저장할 수 있는 데이터 타입.
  - `args`: 배열의 이름으로 사용자가 지정할 수 있음.

 

  • 가장 많이 쓰는 메서드 System.out.print()
System.out.print("데이터1"); // "데이터1" 라는 문자를 출력
System.out.print("데이터2"); // 이어서 "데이터2" 라는 문자를 출력

// 실행 결과
데이터1데이터2

System.out.print() 메서드를 사용하면 출력창에 괄호() 안으로 전달된 데이터를 출력해 준다.

 

  • 줄바꿈 추가 메서드 System.out.println()
System.out.print(7);
System.out.println(3);
System.out.println(3.14);
System.out.println("JAVA");

// 실행 결과
7
3
3.14
JAVA

System.out.print() 메서드를 사용하면 출력창에 괄호() 안으로 전달된 데이터를 줄바꿈 하면서 출력해 준다.

'Back-End (Web) > JAVA' 카테고리의 다른 글

[JAVA] 조건문  (0) 2024.11.11
[JAVA] 연산자  (0) 2024.11.11
[JAVA] 변수와 변수 종류  (0) 2024.11.11
[JAVA] JVM은 뭘까?  (1) 2024.11.11
[JAVA] 자바란 무엇일까?  (0) 2024.10.31

<해당 내용은 내일배움 캠프의 강의를 토대로 제작되었습니다.>

 

JVM (Java Virtual Machine)의 약자로 "자바 가상 머신"이라는 뜻이다.

단순히 여러가지 기기위에 Java 프로그램을 실행 시킬 수 있는 가상의 기기를 만들어 준다.

= 컴퓨터나 핸드폰이라고 해서 자바가 실행되는 것이 아닌, JVM을 통해 컴퓨터나 핸드폰 안에 java를 실행할 수 있는 가상의 기기를 추가해야한다.

자바의 실행 과정

1. 프로그래머는 Java라는 인간이 이해할 수 있는 언어를 기반으로 프로그램을 제작한다.

2. 자바는 운영체제가 이해할 수 있는 형태로 java 언어를 변환하기 위해 Java Compiler를 통해 바이트 코드(운영체제가 이해할 수 있는 언어 형태)로 변환한다.

3. 바이트 언어를 또 기계가 이해할 수 있는 기계어로 번역해 줘야 기기들이 코드를 이해할 수 있는데, 이 번역해주는 부분이 인터프리터, 인터프리터의 효율을 높혀주는 부분이 JIT 컴파일러다.

 

인터프리터

  • 운영체제가 읽은 바이트 코드[운영체제 언어]를 기기(기계)가 실행할 수 있는 기계어로 번역

JIT 컴파일러

  • 인터프리터[운영체제 언어 번역기]의 효율을 높여주는 서포터 해석기

메모리 영역

  • 운영체제로부터 JVM[자바 실행용 가상 기기]이 할당받은 메모리 영역

클래스 로더

Java .class 바이트 코드[운영제제 언어]를 메모리 영역에 담는 운반기

  • JVM으로 class(바이트 코드 [운영제제 언어] )를 불러와서 메모리에 저장함

 

 

JRE

  • 자바의 대표적인 JVM으로, 자바 실행 환경(Java Runtime Environment) 이다.
  • 이게 설치되어 있는 모든 기기는 java 프로그램을 실행 시킬 수 있다.
  • JDK 가 javac 명령을 통해 .java 파일을 실행 가능한 .class 파일로 변환해 줍니다.
  • = 프로그래머가 짠 코드를 운영체제가 이해할 수 있는 코드로 변역해준다.

JDK

  • 자바 개발 키트(Java Development Kit)라는 뜻으로 Java의 개발이 가능하게 만들어주는 프로그램이다.
  • JRE를 포함하는 키트로 덕뿐에 자바의 실행이 가능하다.
  • JDK는 .java 파일들을 .class 파일들로 변환해 주는 Java Compiler(javac) 기능이 있다.
  • JDK는 코드를 디버깅(오류 확인, 추적)하는 jdb 등의 기능이 있다.

 

+ 디버깅(Debugging)은 소프트웨어 개발 과정에서 프로그램의 오류(버그)를 찾아내고 수정하는 작업을 말한다.

  • 프로그램을 한줄 한줄 실행하면서 오류가 있는 부분을 찾아낸다.

'Back-End (Web) > JAVA' 카테고리의 다른 글

[JAVA] 조건문  (0) 2024.11.11
[JAVA] 연산자  (0) 2024.11.11
[JAVA] 변수와 변수 종류  (0) 2024.11.11
[JAVA] 자바 개발을 위한 준비물 IntelliJ  (0) 2024.11.11
[JAVA] 자바란 무엇일까?  (0) 2024.10.31

자바란 무엇일까?

  • 자바는 썬 마이크로시스템즈의 제임스 고실링과 다른 연구가들이 개발한 객체 지향적 프로그래밍 언어이다.

 

자바는 왜 배울까?

 

1) 자바는 간단하다.

- 타 언어에 비해 이해하기 쉽고 단순한 개발이 가능하다는 장점이 있어 현재 널리 사용되고 있다.

 

2) 객체지향 언어다.

- 추후 다시 기술할 예정인 객체지향이란, 코드를 기능별로 박스에 담는다고 생각하면 된다. 이 박스 하나하나가 객체라 불리며, 문제가 생기거나 수정할때 해당 박스 하나만 수정하면 되도록 설계되어 있어 유지보수, 안전성에서 유리하다.

 

3) 한국에서 많이 쓴다...

- 웹 개발에 있어서 한국은 자바 왕국이라는 말이 있을 정도로 자바를 주력으로 많이 사용한다. 취업에 한에서만 이야기하면 자바를 배우는 것이 취업의 문은 상대적으로 넓다는 것 (다만 2024년 기준으로는 개발자 시장이 많이 죽어서 취업이 힘든건 매한가지이다..)

 

 

 

 

'Back-End (Web) > JAVA' 카테고리의 다른 글

[JAVA] 조건문  (0) 2024.11.11
[JAVA] 연산자  (0) 2024.11.11
[JAVA] 변수와 변수 종류  (0) 2024.11.11
[JAVA] 자바 개발을 위한 준비물 IntelliJ  (0) 2024.11.11
[JAVA] JVM은 뭘까?  (1) 2024.11.11

+ Recent posts