관리 메뉴

나구리의 개발공부기록

코드로 시작하는 자바 첫걸음1, 자바란, 변수, 연산자 본문

인프런 - 실전 자바 로드맵/자바 입문 - 자바 첫걸음(무료)

코드로 시작하는 자바 첫걸음1, 자바란, 변수, 연산자

소소한나구리 2024. 10. 31. 19:11

출처 : 인프런 - 자바 입문 - 코드로시작하는 자바 첫걸음 (무료) / 김영한님 


** 참고

  • 매우 기초적인 내용이기때문에 전체 내용이아닌 특별히 작성해야할 내용이나 중요한 내용만 작성
  • 자바기초에 대해서 디테일한 내용은 자바의 정석 기초편을 포스팅한 글들을 참고하는 것을 권장함

1. 자바란

1) 자바 표준 스펙과 구현

  • 자바는 표준 스펙과 구현으로 나눌 수 있음

(1) 자바 표준 스펙

  • 자바를 어떻게 만들어야 한다는 설계도이며 문서이며 이 표준 스펙을 기반으로 여러 회사에서 작동하는 자바를 만듦
  • 자바 표준 스펙은 자바 커뮤니티 프로세스(JCP)를 통해 관리됨

(2) 다양한 자바 구현

  • 여러 회사에서 자바 표준 스펙에 맞추어 실제 작동하는 자바 프로그램을 개발하며 각각의 장단점이 있음
  • 예를 들면 Amazon Corretto는 AWS에 최적화되어있는 등의 특징이 있음
  • 각 회사들은 대부분 윈도우, MAC, 리눅스 같이 다양한 OS에서 작동하는 버전의 자바도 함께 제공함
  • 자바 선택 가이드

 

(3) 변경의 용이

  • 자바의 구현들은 모두 표준 스펙에 맞도록 개발되어 있기 때문에 다른 회사의 자바로 변경해도 대부분 문제 없이 동작함
  • 학습 단계에서는 어떤 자바를 사용하든 크게 상관이 없음

2) 컴파일과 실행

  • Hello.java와 같은 자바 소스 코드를 개발자가 작성
  • javac라는 자바 컴파일러를 사용해서 .class라는 파일이 생성되고 소스 코드를 컴파일함
  • 컴파일을 하면 소스코드를 바이트코드로 변환하고 JVM에서 더 빠르게 실행될 수 있게 최적화하고 문법 오류도 검출함
  • JVM이 실행되면서 프로그램이 작동함

(1) IDE와 Java

  • 인텔리제이는 내부에 자바를 편리하게 설치하고 관리할 수 있는 기능을 제공하기 때문에 해당 기능을 사용하면 별도의 자바 설치없이 인텔리제이로 쉽게 자바를 다운로드 및 실행할 수 있음
  • 자바 언어를 배우는 단계에서는 이렇게 IDE의 도움을 받아 자바를 설치하는 정도로만 이해해도 되고 나중에 자바를 직접 설치하고 환경설정하는 부분은 따로 다룸
  • IDE를 사용해서 자바 코드를 실행하면 컴파일과 실행을 모두 한번에 처리하기 때문에 매우 편리하게 자바 프로그램을 개발하고 학습할 수 있음(이클립스보단 인텔리제이가 훨씬 좋음)

(2) 컴파일

  • 컴파일은 javac라는 프로그램을 직접 사용해야하는데 IDE를 사용하면 자바 코드를 실행할 때 자동으로 처리해줌
  • 프로그램을 실행하면 인텔리제이는 out폴더에, 이클립스는 bin 폴더에 .class파일이 있음
  • 터미널에서 실행할 경우 javac Hello.java 로 실행해야함

(3) 실행

  • 자바를 실행하려면 java라는 프로그램을 사용해야하며 이때 컴파일된 .class파일을 지정해주면 됨
  • 터미널에서 실행할 경우 java Hello 로 확장자를 제외하고 실행해야함

3) 자바와 운영체제 독립성

(1) 일반적인 프로그램

  • 일반적인 프로그램은 다른 운영체제에서 실행할 수 없어서 각각의 운영체제에 맞는 프로그램을 실행해야함
  • 이유는 윈도우 프로그램은 윈도우 OS가 사용하는 명령어들로 구성되어있기 때문에 해당 명령어는 다른 OS와는 호환되지 않기 때문임

(2) 자바 프로그램

  • 자바 프로그램은 자바가 설치된 모든 OS에서 실행할 수 있음
  • 자바 개발자는 특정 OS에 맞추어 개발을 하지 않아도 되고 자바에 맞추어 개발하면 됨
  • OS 호환성 문제는 자바가 해결하고 컴파일된 자바 파일은 모든 자바 환경에서 실행할 수 있음
  • 각 OS에 맞는 자바만 설치만 하면됨

(3) 운영체제 독립성

  • 개발할 때의 자바와 서버에서 실행할 때 다른 자바를 사용할 수 있음
  • 개발 편의를 위해 개발자들은 위도우나 MAC OS를 주로 사용하며 서버는 주로 리눅스를 사용하기에 만약 AWS를 사용한다면 리눅스 서버에 amazon Corretto 자바를 설치하여 최적화를 할 수 있음
  • 자바의 운영체제 독립성 덕분에 각각의 환경에 맞추어 자바를 설치하는 것이 가능함


2. 변수

1) 변수 기본

  • 값을 보관해두고 필요할 때 값을 꺼내서 읽을 수 있는 저장소이며 쉽게 비유하자면 데이터를 담을 수 있는 그릇
  • 변수는 변할 수 있음
  • 숫자를 저장할 수 있는 int 타입인 변수 a에 숫자 10을 저장
  • 이렇게 선언한 변수에 처음으로 값을 대입해서 저장하는 것을 변수 초기화라 함
  • 변수의 값은 반복해서 읽을 수 있으며 변수의 값을 읽는다고 값이 없어지는 것은 아님
public static void main(String[] args) {
    int a;  // 변수 선언
    a = 10; // 변수 초기화
}

2) 변수 값 변경

  • 변수는 위에서 설명했듯이 변할 수 있기 때문에 변수 a에 저장된 값을 언제든지 바꿀 수 있음
  • 중간에 변수값을 바꿔서 출력하면 바뀐 값이 출력되고 변수의 값을 변경하면 변수에 들어있던 기존 값은 삭제됨
public static void main(String[] args) {
    int a;  // 변수 선언
    a = 10; // 변수 초기화
    System.out.println("a = " + a);
    a = 50; // 변수 값 변경
    System.out.println("a = " + a);
}

3) 변수 선언과 초기화

(1) 변수 선언

  • 변수를 선언하면 컴퓨터의 메모리 공간을 확보해서 그곳에 데이터를 저장할 수 있으며 변수의 이름을 통해서 해당 메모리 공간에 접근할 수있음
  • 즉 데이터를 보관할 수 있는 공간을 만들고 그곳에 이름을 부여함

(2) 변수 초기화

  • 변수를 선언하고 선언한 변수에 처음으로 값을 저장하는 것을 변수의 초기화라고함
  • 변수의 선언과 초기화를 각각 따로할 수 있고, 변수선언과 동시에 초기화를 할 수 있음
public static void main(String[] args) {
    // 변수 선언과 초기화를 각각 따로
    int a;
    a = 10;

    // 변수 선언과 초기화를 한번에
    int b = 10;

    int c = 3, d = 4; // 여러 변수 선언과 초기화를 한번에
}

 

(3) 변수는 초기화를 해야함

int e;
System.out.println("e = " + e); // 에러발생
  • 변수를 초기화하지 않고 사용하게 되면 컴파일 에러가 발생함
  • 컴퓨터에서 메모리는 여러 시스템이 함께 사용하는 공간이기에 어떠한 값들이 계속 저장되는데 변수를 선언하면 메모리상의 어떤 공간을 차지하고 사용함
  • 그런데 그 공간에 기본에 어떤 값이 있었는지는 아무도 모르기 때문에 초기화를 하지 않으면 이상한 값이 출력될 수 있어서 이러한 문제를 예방하기 위해 자바는 변수를 초기화하도록 강제함
  • 초기화하지않은 변수는 컴파일 단계에서 자동으로 최적화되어 사라짐

** 참고

  • 지금 학습하는 변수는 지역변수라고하는데 지역변수는 개발자가 직접 초기화를 해주어야 하고 나중에 배울 클래스 변수와 인스턴스 변수는 자바가 자동으로 초기화를 진행해줌
  • 컴파일 에러는 자바 문법에 맞지 않았을 때 발생하는 에러이며 컴파일 에러는 오류를 빠르고 명확하게 찾을 수 있기 때문에 좋은 에러임

4) 변수 타입1

(1) 변수 타입 종류

  • int : 정수를 다룸 ex) 1, 100, 1000, -1000
  • double : 실수를 다룸 ex) 0.2, 1.5, 100.121
  • boolean : 불리언 타입으로 true, false값만 사용(참과 거짓을 판단하는 곳에서 사용)
  • char : 문자 하나를 다룰 때 사용하고 작은 따옴표(')를 사용해서 감싸야 함 ex) 'A', '가'
  • String : 문자열을 다루며 큰 따옴표를 사용해야 함 ex) "hello java"

** 참고

  • String은 첫 글자가 대문자로 시작하는 특별한 타입이며 뒤에서 String에 대한 자세한 내용을 다룸
  • 각 변수는 지정한 타입에 맞는 값을 사용해야하며 자동형변환이 되지 않는 값을 입력하면 에러가 발생함

(2) 리터럴

  • 코드에서 개발자가 적은 100, 10.5, true, 'A', "Hello Java"와 같은 고정된 값을 프로그래밍 용어로 리터럴(literal)이라고 함
  • 변수의 값은 변할 수 있지만 리터럴은 개발자가 직접 입력한 고정된 값이기때문에 변하지 않음
public static void main(String[] args) {
    int a = 100;             //정수 리터럴
    double b = 10.5;         //실수 리터럴
    boolean c = true;        //불리언 리터럴
    char d = 'A';            //문자 하나 리터럴
    String e = "Hello Java"; //문자열 리터럴
}

5) 변수 타입2

(1) 다양한 숫자 타입

  • 메모리를 적게 사용하면 작은 숫자를 표현할 수 있고 메모리를 많이 사용하면 큰 숫자를 표현할 수 있음
  • 즉, 변수를 선언하면 표현 범위에 따라 메모리 공간을 차지하기 때문에 필요에 맞도록 다양한 타입을 사용하면 됨
  • 실수에서 float보다 double이 정밀도가 더 높으며 double이 기본형

(2) 정수형

  • byte : -128 ~ 127 (1byte, 2^8)
  • int : -2,147,483,648 ~ 2,147,483,647 (20) (4byte, 2^32)
  • long : -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 (8byte, 2^64)
  • short : -32,768 ~ 32,767 (2byte, 2^16)

(3) 실수형

  • float : 대략 -3.4E38 ~ 3.4E38, 7자리 정밀도 (4byte, 2^32)
  • double : 대략 -1.7E308 ~ 1.7E308, 15자리 정밀도 (8byte, 2^64)

(4) 기타

  • boolean : true , false (1byte)
  • char : 문자 하나(2byte)
  • String : 문자열을 표현. 메모리 사용량은 문자 길이에 따라 동적으로 달라짐

6) 변수 타입 정리

(1) 실무에서 거의 사용하지 않는 타입

  • byte : 표현 길이가 너무 작음, 자바는 기본으로 4byte(int)를 효율적으로 계산하도록 설계되어있어서 int를 사용하는 것을 권장하며, byte타입을 직접 선언하고 숫자 값을 대입해서 계산하는 일은 거의 없음
  • 대신 파일을 바이트 단위로 다루기 때문에 파일 전송, 파일 복사 등에 주로 사용됨
  • short : 위와 동일함
  • float: 표현 길이와 정밀도가 너무 낮아서 double을 사용함
  • char : 문자 하나를 표현할 일이 거의 없고 문자 하나를 표현할 때도 문자열을 사용할 수 있어서 거의 사용안함
  • 메모리 용량은 매우 저렴하기 때문에 메모리 용량을 약간 절약하기보다는 개발 속도나 효율에 초점을 맞추는 것이 더 효과적임

(2) 자주 사용하는 타입

  • 정수(int, long) : 자바는 정수에 기본으로 int를 사용하고 20억이 넘을 것 같으면 long을 사용하면됨, 파일을 다룰 때만 byte를 사용
  • 실수 : 고민없이 double을 사용
  • 불린형(boolean) : true, false로 참 거짓을 표현하고 조건문에서 자주 사용됨
  • 문자열(String) : 문자를 다룰 때는 문자의 개수가 하나이든 여러개이든 String을 사용하는 것이 편리함
  • 자주 사용하는 타입을 제외하고 나머지를 실무에서 사용하는 경우는 거의 없기 때문에 자주사용하는 타입 외에는 그냥 넘어가도 충분함

7) 변수 명명 규칙

(1) 규칙

  • 규칙은 필수이며 규칙을 지키지 않으면 컴파일 오류가 발생함
  • 변수 이름은 숫자로 시작할 수 없음, 숫자를 이름에 포함하는 것은 가능함
  • 이름에는 공백이 들어갈 수 없음
  • 자바의 예악어를 변수 이름으로 사용할 수 없음
  • 변수 이름에는 영문자, 숫자, 달러 기호, 밑줄 만 사용할 수 있음

(2) 관례

  • 관례는 필수는 아니지만 전세계 개발자가 해당 관례를 따르기 때문에 사실상 규칙이라고 생각해도 됨
  • 소문자로 시작하는 낙타 표기법을 사용
  • 변수 이름은 소문자로 시작하는 것이 일반적임
  • 여러 단어로 이루어진 변수의 이름의 경우 첫번째 단어는 소문자로 시작하고 그 이후의 단어는 대문자로 시작하는 낙타 표기법(camel case)를 사용함  (ex - orderDetail, myAccount)
  • 클래스는 대문자로 시작하고 나머지는 소문자로 시작하며 낙타 표기법을 사용함(ex - OrderDetail)
  • 상수는 모두 대문자를 사용하고 언더바로 구분함
  • 패키지는 모두 소문자를 사용함

** 참고

  • 변수 이름은 의미있고 그 용도를 명확하게 설명해야함
  • 변수의 이름을 의미있게 짓는것은 실무에서 생각보다 중요함

3. 연산자

  • 자바에는 다양한 연산자가 있기에 여기에서는 실무에서 주로 다루는 연산자 위주로 설명
  • 연산자(operator) : 연산 기호
  • 피연산자(operand) : 연산 대상

1) 산술 연산자

(1) 연산자 종류

  • + : 더하기
  • - : 빼기
  • * : 곱하기
  • / : 나누기
  • % : 나머지

(2) 주의

  • int div =  5 / 2의 결과는 2.5가 되어야하지만 소수점이 제거된 2가 나오는데 자바에서 같은 int형 끼리 계산하면 결과도 같은 int형을 사용하기 때문에 소수점 이하는 버림 처리가됨 -> 자세한 내용은 형변환에서 다룸
  • 나머지 연산자는 이름 그대로 나눗셈의 나머지를 구하는 연산이며 5 / 2를 할 경우 나머지인 1을 반환함
  • 나머지 연산자는 실무와 알고리즘 모두 종종 사용되기에 잘 기억해두어야 함
  • 숫자는 0으로 나눌 수 없어(수학에서 허용하지 않음) 프로그램 오류가 발생함

2) 문자열 더하기

(1) 문자열 + 문자열

  • 자바는 특별하게 문자열에도 + 연산자를 사용할 수 있음
  • 문자열에 + 연산자를 사용하면 두 문자를 연결할 수 있음
//문자열과 문자열 더하기
String result1 = "hello " + "world"; 
System.out.println(result1);

/* 출력결과
hello world
*/

 

(2) 문자열 + 숫자

  • 문자와 숫자를 더하면 숫자를 문자열로 변경한다음에 서로 더함
  • 전체 결과가 문자열로 출력됨
//문자열과 숫자 더하기
String result3 = "a + b = " + 10;
System.out.println(result3);

/* 출력결과
a + b = 10
*/

 

(3) 문자열 + 숫자 계산 과정

  • 계산 과정을보면 숫자가 문자열로 변경되는데 이를 자동 형변환이된다고 함
int num = 20;
String str = "a + b = ";
String result4 = str + num;

str(String) + num(int)
"a + b = "(String) + num(int) //str 변수에서 값 조회
"a + b = "(String) + 20(int) //num 변수에서 값 조회
"a + b = "(String) + "20"(int -> String) //숫자를 문자열로 변경
"a + b = " + "20" //문자열과 문자열 더하기
"a + b = 20" //결과

3) 연산자 우선순위

(1) 사칙연산의 우선순위

  • 일반적으로 적용되는 사칙연산의 우선순위가 적용됨
  • 수학과 마찬가지로 ()를 사용하면 ()를 사용한 곳이 먼저 계산됨

(2) 자바의 연산자 우선순위

  1. 괄호 : ()
  2. 단항 연산자 : ++, --, !, ~, new, (type)
  3. 산술 연산자: *, /, % 우선 그다음 + , -
  4. shift 연산자 : <<, >>, >>>
  5. 비교 연산자 : <, <=, >, >=, instanceof
  6. 등식 연산자 : ==, !=
  7. 비트 연산자 : &, ^, |
  8. 논리 연산자 : &&, ||
  9. 삼항 연산자 : ? :
  10. 대입 연산자 : =, +=, -=, *=, /=, %= 등등

(3) 연산자의 우선순위 암기법

  • 대부분의 실무 개발자들은 연산자 우선순위를 외우지 않으며 딱 2가지만 기억하면됨
  • 상식선에서 우선 순위를 사용(일반적인 사칙연산 우선순위)
  • 애매하면 괄호()를 사용
  • 누구나 코드를 보고 쉽고 명확하게 이해할 수 있어야 하기 때문에 개발자들이 연산자 우선순위를 외우고 개발하는 것이아니기에 복잡하면 명확하게 괄호를 입력하는 것을 권장함
  • 연산자의 우선순위는 상식선에서 생각하여 적용하고 개발에서의 가장 중요한것은 단순함과 명확함이기에 애매하거나 복잡하면 안됨

4) 증감 연산자

(1) 설명

  • 증가 및 감소 연산자를 줄여서 증감 연산자라고 함
  • 증감 연산자는 ++와 --로 표현되며 변수의 값을 1만큼 증가시키거나 감소시킴
  • 프로그래밍에서는 값을 1씩 증가하거나 1씩 감소할 때가 아무 많기 때문에 이런 편의 기능을 제공함
int a = 0;
++a; // a = a + 1과 동일
--a; // a = a - 1과 동일

 

(2) 전위, 후위 증감연산자

  • 증감 연산자는 피연산자 앞에 두거나 뒤에 둘 수 있으며, 연산자의 위치에 따라 연산이 수행되는 시점이 달라짐
  • ++a: 증감 연산자가 피연산자 앞에 있는 것을 전위 증감 연산자라함
  • a++: 증감 연산자가 피연산자 뒤에 있는 것을 후위 증감 연산자라함
  • 전위 증감 연산자는 증감 연산이 먼저 수행 된 후에 나머지 연산이 수행되고 후위 증감 연산자는 다른 연산이 먼저 수행된 후 증감 연산이 수행됨
  • 증감 연산자를 단독으로 사용하는 경우에는 다른 연산이 없기 때문에 본인의 값만 증가하여 전위든 후위든 둘다 결과가 같음
// 전위 증감 연산자 사용 예
int a = 1;

int b = 0;
b = ++a; // a의 값을 먼저 증가시키고, 그 결과를 b에 대입
System.out.println("a = " + a + ", b = " + b); // 결과: a = 2, b = 2

// 후위 증감 연산자 사용 예
a = 1; // a 값을 다시 1로 지정
b = 0; // b 값을 다시 0으로 지정
b = a++; // a의 현재 값을 b에 먼저 대입하고, 그 후 a 값을 증가시킴
System.out.println("a = " + a + ", b = " + b); // 결과: a = 2, b = 1

// 다른 연산이 없기 때문에 둘다 1이 증가가 됨
++a;
a++;

5) 비교 연산자

  • 두 값을 비교하는 데사용하며 주로 조건문과 함께 사용함

(1) 종류 

  • == : 동등성 (equal to)
  • != : 불일치 (not equal to)
  • > : 크다 (greater than)
  • < : 작다 (less than)
  • >= : 크거나 같다 (greater than or equal to)
  • <= : 작거나 같다 (less than or equal to)

(2) 주의점

  • = 과 == 은 완전히 다른 연산이기에 주의해야함(= 는 대입연산자로 변수에 값을 대입하는 것임)
  • 비교 연산자를 사용하면 참(true) 또는 거짓(false)라는 결과가 나오기 때문에 boolean형으로 반환됨
  • 불일치 연사는 !=을 사용하며 !는 반대(부정)이라는 뜻

(3) 문자열 비교

  • 문자열이 같은지 비교할 때는 ==이 아니라 .equals() 메서드라는 것을 사용해야하는데 ==을 사용하면 성공할 때도 있지만 실패할 때도 있기 때문임
  • 이부분을 지금 이해하기는 어려우므로 뒤에서 따로 다룸

6) 논리 연산자

  • boolean형인 true, false를 비교하는데 사용함

(1) 종류

  • && (and) : 두 피연산자가 모두 참이면 참을 반환, 둘 중 하나라도 거짓이면 거짓을 반환
  • || (or) : 두 피연산자 중 하나라도 참이면 참을 반환, 둘다 거짓이면 거짓을 반환
  • ! (not) : 피연산자의 논리적 부정을 반환 즉, 참이면 거짓을, 거짓이면 참을 반환

(2) 활용

  • 연산자 우선순위로 비교 연산자가 먼저 진행되고 논리 연산자가 진행 됨
  • a가 15일때 a > 10 의 조건과 a < 20 조건 모두를 만복하기 때문에 결과가 true가 나옴
  • 방금과 같은 조건식의 경우 맨 아래처럼 작성하는 것이 가독성이 더 좋음
int a = 15;
//a는 10보다 크고 20보다 작다
boolean result = a > 10 && a < 20;         //(a > 10) && (a < 20)
System.out.println("result = " + result);  // 결과 true

// 이렇게 작성하는 것이 가독성이 좋음
boolean result = 10 < a && a < 20;

7) 대입 연산자

  • 대입 연산자(=)는 값을 변수에 할당하는 연산자이며 값을 초기화할 때 사용함
  • +=, -=, *=, /=, %= 처럼 축약(복합) 대입 연산자로 사용할 수 있음
inta=5; // 5
a+=3;   // 8  (5 + 3)  : a = a + 3
a-=2;   // 6  (8 - 2)  : a = a - 2
a*=4;   // 24 (6 * 4)  : a = a * 4 
a/=3;   // 8  (24 / 3) : a = a / 3
a%=5;   // 3  (8 % 5)  : a = a % 5