인프런에서 제공하는 [김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음]을 수강하며, 새로 배운 내용을 정리합니다.
→ 본문의 내용은 강의 내용에 대한 직/간접적 인용임을 밝힙니다!

하일 김영한..!

#1. Hello World

자바란?

→ 자바는 표준 스펙구현으로 구분된다!

자바 표준 스펙

  • 자바를 어떻게 만들어야 할지에 대한 설계도, 문서이다.
  • 이 표준 스펙을 깁나으로 여러 회사에서 실제 작동하는 자바를 만든다.
  • 자바 표준 스펙은 자바 커뮤니티 프로세스(JCP)에서 관리!

다양한 자바 구현

  • 오라클 Open JDK, Amazon Coretto 등, 여러 회사에서 자바 표준 스펙에 맞추어 실제 작동하는 자바 프로그램을 개발한다.
    • 가령, Amazon Coretto는 AWS에 최적화!

컴파일과 실행

[ 자바 프로그램의 실행 단계 ]
1. 자바 소스 코드를 개발자가 작성
2. 자바 컴파일러를 사용해서, 소스 코드를 컴파일

  • 자바가 제공하는 javac 프로그램을 사용한다.
  • .java.class 파일로!
  • 이 자바 소스 코드를 바이트코드로 변환하며, 자바 가상 머신에서 더 빠르게 실행될 수 있게 최적화하고, 문법 오류를 검출!
  1. 자바 프로그램을 실행한다.
  • 자바가 제공하는 java 프로그램을 사용
  • 자바 가상 머신(JVM)이 실행되면서 프로그램이 작동한다!

자바와 운영체제 독립성

  • 일반적인 프로그램은 다른 운영체제에서 실행이 불가!
    • 이는, 윈도우 프로그램은 윈도우 OS가 사용하는 명령어들로 구성되어 있어, 다른 OS와는 호환되지 않기 때문!
  • 자바 프로그램은, 자바가 설치된 모든 OS에서 실행이 가능!
    • 컴파일된 자바 파일은 모든 자바 환경에서 실행이 가능하다.

#2. 변수

변수 선언과 초기화

Q. 만약 변수를 초기화하지 않고 사용하면 어떻게 될까?

java : variable a might not have been initialized
  • 변수를 선언하면 메모리상의 어떤 공간을 차지하고, 사용한다.
  • 그런데, 그 공간에 어떤 값이 있었는지는 알 수 없음.
  • 따라서 변수를 초기화하지 않으면 이상한 값이 출력될 수 있음!
    • 이 문제를 예방하기 위해 자바는 변수 초기화를 강제한다!

변수 타입 정리

[ 실무에서 자주 사용하는 타입 ]

  • 정수 : 기본으로 int를 사용! 만약 20억을 넘을 것 같으면 long을 쓴다.
  • 실수 : double !
  • 문자열 : 문자 하나든 문자열이든 모두 String을 사용하는 것이 편리!

#4. 조건문

자바 14 새로운 switch문

[ 새로운 switch 문 예시 ]

package cond;

public class Switch3 {
	public static void main(String[] args) {
    	int grade = 2;
        
        int coupon = switch (grade) {
        	case 1 -> 1000;
            case 2 -> 2000;
            case 3 -> 3000;
            default -> 500;
         }
       }
    }

#6. 스코프, 형변환

스코프 존재 이유

→ 변수를 선언한 시점부터, 제약 없이 변수를 계속 사용할 수 있다면?

  • 비효율적인 메모리 사용 : 불필요한 메모리가 낭비될 수 있음! 변수를 적절한 스코프 안에 선언했다면, 해당 코드 블록의 종료 시점에 이 변수를 메모리에서 제거해서 더 효율적으로 사용할 수 있다.
  • 코드 복잡성 증가 : 코드를 유지보수할 때, 더 이상 사용하지 않을 변수여도 계속 신경써야 한다. 한 마디로, 스코프가 불필요하게 넓어지는 것!

형변환

  • 작은 범위에서 큰 범위로는 당연히 값을 넣을 수 있다!
    • int -> long -> double
  • 큰 범위에서 작은 범위는 다음과 같은 문제가 발생할 수 있다.
    • 소수점 버림
    • 오버플로우

자동 형변환

  • 작은 범위에서 큰 타입으로의 대입은 개발자가 직접 형변환을 하지 않아도 된다. 이를 자동 형변환, 또는 묵시적 형변환이라 한다.

명시적 형변환

[ 형변환과 오버플로우 ]
→ 형변환을 할 때 만약 작은 숫자가 표현할 수 있는 범위를 넘어선다면?

maxIntOver = 2147483648L;
intValue = (int) maxIntOver;

// intValue = 2147483648;
  • 보통 오버플로우가 발생하면, 마치 시계가 한 바퀴 돈 것처럼 다시 처음부터 시작한다.

연산과 형변환

  • 같은 타입은 같은 결과를 낸다!
  • 서로 다른 타입의 계산은, 큰 범위로 자동 형변환이 일어난다!

#7. 훈련 (Scanner 학습)

Scanner scanner = new Scanner(System.in);

→ System.in을 사용해서 사용자의 입력을 편리하게 받도록 도와준다.

  • scanner.nextLine() : 엔터(\n)를 입력할 때까지 문자를 가져온다.
  • scanner.nextInt() : 입력을 int 형으로 가져온다. 정수 입력에 사용!
  • scanner.nextDouble() : 입력을 double 형으로 가져온다. 실수 입력에 사용!

#8. 배열

배열의 선언과 생성

  1. int[] students → 배열 변수 선언
  2. students = new int[5] → 배열 생성
  • new는 새로 생성한다는 뜻, int[5]int형 변수 5개라는 뜻
  1. 배열 참조값 보관
  • new int[5]와 같이 배열을 생성하면, 배열의 크기만큼 메모리를 확보한다.
  • 배열을 생성하고 나면 자바는 메모리 어딘가에 있는, 이 배열에 접근할 수 있는 참조값(주소)을 반환한다.
  • 앞서 선언한 배열 변수인 int[] students에 생성된 배열의 참조값을 보관한다.
System.out.println(students) //[I@4617c264

→ 앞의 I는 int형 배열을 뜻하고, @뒤에 16진수는 참조값을 뜻함!

기본형 vs 참조형

  • 기본형 : int, long, double, boolean과 같이 변수에 사용할 값을 직접 넣을 수 있는 데이터 타입을 기본형이라 한다.
  • 참조형 : int[] students와 같이 데이터에 접근하기 위한 참조(주소)를 저장하는 데이터 타입을 참조형이라 한다.

cf. 왜 배열은 참조형을 활용할까?

  • 기본형은 선언과 동시에 크기가 정해진다. 따라서 크기를 동적으로 바꿀 수 없음!
  • 반면 참조형은 크기를 동적으로 할당하여, 유연성을 제공할 수 있음!

배열의 편리한 초기화

int[] students = {90,80,70,60,50};

향상된 for문

for (변수 : 배열 또는 컬렉션) {
	// 배열 또는 컬렉션의 요소를 순회하면서 수행할 작업
}

→ 증가하는 인덱스 값을 직접 사용해야 하는 경우에는, 사용할 수 없음!

#9. 메서드

메서드 호출과 용어 정리

  • 인수(Argument)
    • 메서드에 넘기는 값. 아규먼트, 인수, 인자라는 용어 모두 사용!
  • 매개변수(Parameter)
    • 메서드를 정의할 때 선언한 변수.

[ void와 return 생략 ]

  • 모든 메서드는 항상 return을 호출해야 한다.
  • 반환 타입 void의 경우에는 예외로 이를 생략해도 된다.
  • 자바가 반환 타입이 없는 경우에는 return을 마지막에 넣어 준다!

메서드 호출과 값 전달1

[ 자바에서 아주 중요한 대원칙!! ]

자바는 항상 변수의 값을 복사해서 대입한다.

public class MethodValue2 {
    public static void main(String[] args) {
        int number = 5;
        System.out.println("1. changeNumber 호출 전, num1: " + number);
        changeNumber(number);
        System.out.println("4. changeNumber 호출 후, num1: " + number);

    }

    public static void changeNumber(int number) {
        System.out.println("2. changeNumber 변경 전, num2: " + number);
        number = number * 2;
        System.out.println("3. changeNumber 변경 후, num2: " + number);

    }
}

[ 실행 결과 ]

1. changeNumber 호출 전, number: 5 
2. changeNumber 변경 전, number: 5 
3. changeNumber 변경 후, number: 10 
4. changeNumber 호출 후, number: 5

메서드 오버로딩

이름이 같고 매개변수가 다른 메서드를 여러 개 정의하는 것을 말한다.

add(int a, int b)
add(int a, int b, int c)
add(double a, double b)

[ cf. 메서드 시그니처(method signature) ]
→ 메서드 이름 + 매개변수 타입(순서)

  • 자바에서 메서드를 구분할 수 있는 고유한 식별자나 서명을 뜻함.
  • 메서드의 이름과 매개변수 타입(순서 포함)으로 구성!
  • 반환 타입은 시그니처에 포함되지 않는다!
profile
주니어 백엔드 개발자입니다! 조용한 시간에 읽고 쓰는 것을 좋아합니다 :)

0개의 댓글

Powered by GraphCDN, the GraphQL CDN