JAVA 기초 및 변수

금송·2024년 8월 30일
0

이론

목록 보기
9/17
post-thumbnail

자바 세팅

java LTS : 8, 17, 21
오랫동안 지원받을 java 예정인 버전
스프링 부트와의 호환을 생각해서 21 버전으로 사용할 예정

자바에서 package = 폴더
ui 에서 확인하면 폴더와 똑같이 노출됨


main 메서드
실행할 수 있는 시작점. 실행 단위 중 하나
왼쪽의 녹색 버튼이나 위쪽의 녹색 버튼으로 런 가능

자바의 특징

자바란

자바는 수많은 컴퓨터 프로그래밍 언어 중 하나
컴퓨터 프로그래밍에 사용하는 언어

자바로 할수 있는 것

  • 웹 프로그램 작성
  • 안드로이드 개발
  • 데이터베이스 처리 (정보를 저장하는 시스템)
  • 대용량 데이터 처리 (백엔드에서 처리할 수 있는 부분, 프레임워크로 사용, 카프카도 많이 사용)

자바의 특징

자바를 다 배우고 한번 더 읽어보는걸 추천!

객체 지향 언어이다.

객체 - 하나하나의 요소

프로그램을 하나 만드는데 하나하나의 객체로 구성되어 있다. 그 객체들이 서로 상호작용 하면서 프로그램을 동작 시킨다. 이렇게 완성하는 기법을 객체 지향 프로그래밍 (OOP)라고 한다.

다양한 프로그램 작성 방식 중 하나. 6장에서 한번 더 짚고 넘어갈 예정.

ex) 자동차를 만드는데 수많은 부품이 필요함, 자동차 = 프로그램 / 수많은 부품 = 객체

메모리를 자동으로 관리해준다

C++ : 메모리를 코드상에서 관리 해야 함 ↔ JAVA : 메모리를 자동으로 관리 해줌

개발자가 할 일을 조금 덜어준다고 이해하면 됨. 메모리를 관리하는 Garbage Collector (GC)가 있음.

프로그램상에 문제가 있을 때 GC를 직접 들여다 볼 수 있음. 자바에 특화된 기능.

java script에는 GC가 없음. 해당 언어는 인터프리터 언어로 한줄한줄 실행 시켜서 따로 GC가 없다.

풍부한 라이브러리

라이브러리 - 개발자가 개발을 할 때 필요로 하는 것들을 가져다 쓸 수 있는 것. 마치 도서관에서 책을 빼 쓰듯이.

운영체제에 독립적

JVM - 눈에 보이지 않는 가상 머신

자바 소스(사람이 읽을 수 있는 파일)에 코드를 작성해서 컴파일 해주면 기계들이 이해할 수 있도록 클래스 파일(기계가 읽을 수 있는 파일) 로 변환되고 JVM(가상의 머신)으로 실행되는 것

인텔리제이에서 런을 시킨다는 건 : 자바소스를 자바 컴파일러를 시켜준 다음 클래스 파일로 빌드 시킨 후 실행 시킨 것.

RUN : 컴파일, 빌드 → 실행 (런타임)

컴파일 단계 : 코드를 작성하는 단계

실행 (런타임) : 런 시킨 후 단계

런타임 데이터 에어리어 - 개발자가 선언한 변수, 클래스, 매서드 등등 저장해두는 창고

익스큐션엔진 - 말 그대로 런 시켜주는 엔진

클래스 로더 - 번역가, 클래스 파일을 기계가 알아 들을 수 있도록 번역을 해주는 친구.

GC - 메모리를 관리해주는 친구. 런타임 데이터 에어리어에서 사용하지 않는 코드가 있으면 알아서 제어.

일단 구조랑 키워드만 알아두기

자바 파일 실행 과정

개발자가 anyprogram.java를 작성 > 컴파일을 시킨 후 클래스 파일로 변환 > JVM이란 녀석이 각 OS에 따라 실행 시켜줌 > 런이 됨

자바의 가장 큰 장점 중 하나는 한번 작성 하면 어디서든 실행된다.(”Write Once, run anywhere”) → JVM이 있기에 가능한 장점

터미널에서 컴파일 시키기

cd C:\Users\사용자명.jdks\corretto-17.0.9\bin

bin>javac

javac 로 컴파일 가능

해당 명령어를 치면 클래스 파일이 생성됨 (JVM이 인식할 수 있는 이진(binary) 파일로 만들어주는 것 )

특징 맨 아래 내용 다시 확인하기

  1. 자바 소스파일 Main.java 를 작성합니다.
  2. bin 폴더에서 javac를 이용하여 Main.java를 컴파일해줍니다.
    • 컴파일러(javac)는 Main.java 소스파일을 Main.class 클래스 파일로 컴파일 합니다. JVM이 인식할 수 있는 이진(binary) 파일로 만들어주는 것이죠.

  • 컴파일이 완료되었다면 아무런 메시지가 출력되지 않고, Main.java파일과 같은 위치에 Main.class 파일이 생성 되었을겁니다.

  1. JVM은 클래스 파일을 해석하여 실행합니다.

  • java 라는 실행 명령어로 클래스 파일을 실행했지만 오류가 발생하죠. 비록 오류는 발생했지만 자바 프로그램을 실행하는데는 성공했습니다.

여기까지 직접 java javac 명령어로 자바 코드를 실행해보았습니다.
위 2, 3번에서 수행하는 컴파일, 실행 과정을 인텔리제이(IntelliJ)에서는 Run 버튼 하나만으로도 수행됩니다 🙂

IDE 존재의 이유

자바 공식 문서

https://docs.oracle.com/javase/8/docs/api/index.html?overview-summary.html

메서드 작성 후 컨트롤 누르고 클릭하면 설명을 읽을 수 있음.

컨트롤 누르고 메서드 눌러도 볼수있음

해당 버튼 클릭 시 파일 위치를 알수있음.

자바 이전의 많이 사용하는 기본적인 자료 구조들은 해당 base에 다 들어가 있음

자바 표준 API 문서, JDK

import문
import java.util.HashMap;
import 패키지.클래스;
해당문을 작성해야 아래에 해당 클래스 라이브러리를 사용할 수 있음.

없으면 해당 이미지처럼 나오고 해당 버튼 클릭시 임포트문이 작성 됨.

제네릭 - <>로 되어있고 안에 파라미터를 넣어서 사용하는 것, 타입파라미터를 정의할 수 있음.

자바 코드

주석과 실행문

주석처리

// : 행 주석
// 라인부터 끝까지 주석 처리. 한 줄만 주석 할 때 해당 주석 방식 사용

// 한줄한줄한줄한줄한줄한줄한줄한줄한줄한줄한줄한줄

/~/ : 여러 행 주석, 범위 주석
/**/ 라인부터 끝까지 주석 처리. 여러줄을 주석 할 때 해당 주석 방식 사용

/*
여러줄여러줄여러줄여러줄여러줄여러줄여러줄여러줄여러줄여러줄
여러줄여러줄여러줄여러줄여러줄여러줄여러줄여러줄여러줄여러줄
*/

실무에서 사용할 때 코드의 기능, 히스토리, 설명 등 즉 존재 이유를 작성하는데 찬반 논란이 있음.
이후에 변수 명과 메서드 명은 의미 있는 네이밍으로 하는 게 중요!
ex) int index = 1 // void 의미있는_네이밍() {}
이때 커밋 할 때는 의미있는 주석이 아니거나 나한테만 필요한 주석이면 삭제 후 커밋 한다.

실행문

실행문은 변수 선언, 값 저장, 메소드 호출에 해당하는 코드

자바에서 실행문의 종류

변수 선언문, 값 저장, 메소드 호출, 제어문(if 조건, for 반복) / 대략 해당 범주 안에서 정리됨.
웬만하면 한 줄 한 줄 이후에 세미클론을 붙여준다 (;) 이유는 세미클론을 보고 실행문의 끝을 인지함. 반드시 붙여준다.

// 해당 코드 작성법을 추천
int index = 1; // 변수의 선언과 값 저장
int loop = 2;
int result = index + loop;
System.out.println(result);// 메소드 호출 println()

예를 들어 앞의 코드를 다음과 같이 바꾸어 작성해도 전혀 문제가 없음.

// 추천하지는 않지만 사용할수는 있음
int index = 1; int loop = 2;
int result = 
		index + loop;
System.out.println(result);

파이썬이나 스포크 안붙임, 이유는 줄 바꿈으로 실행문의 끝을 이해함

자바 코드 살펴보기

구조
public - 접근제어자, 클래스 파일 하나에 public class는 무조건 하나는 들어가 있어야 함

// 클래스 블록
public class 클래스명 {

		//필드라고 하는애가 들어오기도 함.

    /* 메서드 블록 */
    [public|private|protected] [static] (리턴자료형|void) 메서드명1(입력자료형 매개변수, ...) {
//  [접근 제어자(여기선 없어도 괜찮음), []는 생략가능] (리턴 타입이라고도 함, 없으면 void) 메서드명 (매개변수 목록이 올수도 하나만 적을수도 있음.)
//  여기서 main 메서드는 자바에서 실행을 할수있는 특이한 메서드이다.
        명령문(statement);
        실행문
        ex)
        int result = 11;
        return result;
        ...
    }

    /* 메서드 블록 */
    [public|private|protected] [static] (리턴자료형|void) 메서드명2(입력자료형 매개변수, ...) {
        명령문(statement);
        ...
    }

    ...
}

메서드명 네이밍

특정 규칙이 있음 거의 컨벤션임. → 맨 앞엔 동사로 시작
ex) 회원정보를 조회한다! getMembersProfile || findMembersProfile
회원정보를 저장한다! saveMembersProfile

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}
  • 위의 메서드 명은 main
  • void 리턴형은 빈 리턴형, 메서드 수행 후 리턴되는 값이 없다는 의미
  • 리턴타입 앞에 static 키워드가 있기에 정적임을 의미하고 객체를 만들지 않아도 클래스명.메서드명 형태로 호출 가능하다.
    - ex) HelloWorld.main 사실 좋지 않은 예시 :-)
  • String[] args는 메서드의 매개변수. 자료형은 String의 배열이고 arg라는 변수명을 가진다.

명령문(실행문)

명령문의 맨 뒤에는 세미콜론(;)을 항상 표시
자바에서는 명령문 맨 뒤에 반드시 이것을 표기해 문장이 끝났다는 것을 표기해야한다.
클래스 블록 안에서 변수 선언 가능, 메서드 블록 안에서도 변수 선언 가능하다.

(별첨) 지금 알아도 좋은 추가 내용

클래스 안에는 어떤 내용이 들어갈까

변수

변수란

변하는 수
프로그래밍 하는 과정에서 필요에 따라 데이터를 저장할 때 사용하는 공간
변수를 선언했을 때 특정 공간이 할당된다.
특정 메서드를 변수에 저장하기도 함.
변수에는 하나의 값만 저장할 수 있음. 단 배열 자료형의 경우엔 복수개의 값을 저장

변수의 선언과 저장

(자료형 타입)(변수명) = (값); 순서기억!
오른쪽 값을 왼쪽의 변수에 할당한다.

int age = 20;
double pi = 3.14;

예약어

자바에 예약어라는 것이 있다.
해당 예약어로는 변수를 설정하면 컴파일 에러가 난다.
아래 내용처럼 빨간줄이 그여진다.
예약어는 아래 표 확인.

분류예약어
기본 데이터 타입boolean, byte, char, short, int, long, float, double (실수형 타입)
접근 지정자private, protected, public, default
클래스와 관련된 것class, abstract, interface, extends, implements, enum
객체와 관련된 것new, instanceof, this, super, null
메소드와 관련된 것void (리턴 값이 없을 때) , return
제어문과 관련된 것if, else, switch, case, default, for, do, while, break, continue
논리값true, false
에외 처리와 관련된 것try, catch, finally, throw, throws
기타transient, volatile, package, import, synchronized, native, final, static, strictfp, assert

변수 값 읽기

public class VariableExample {
	int value;
	int result = value + 10;
}

변수 value는 선언만 되고 초기화 되지 않은 값이기 때문에 산술 연산식에서 사용할수 없음.

value의 초기값을 설정하면 해결 가능!

변수의 호출

변수의 호출은 선언한 해당 중괄호 블럭 내에서만 호출 가능하다.
지역변수과 같은 개념.
외부에서 호출하면 호출 불가능

하나의 블럭 안에서 변수명이 중복되서 사용되면 안되지만 중괄호 스코프가 다르면 사용 가능하다.

클래스 or 변수 네이밍 규칙

변수의 네이밍 규칙은 다음과 같습니다.
1. 숫자로 시작해서는 안됨.
2. 예약어를 사용해서는 안됨.
3. 자가 구분되며 길이에는 제한이 없음. (다만, 길이가 너무 길어진다면 가독성이 많이 떨어지니 주의.)
4. 특수문자는 언더바(_)와 달러($)만 가능.

위의 네이밍 규칙은 자바 컴파일러가 규정하는 규칙이지만, 다음으로 오는 네가지는 ‘컨벤션’, 혹은 권장사항 정도로 알고계시면 좋음.
1. 클래스나 변수명은 영문이어야 합니다.
2. 클래스명의 첫 글자는 항상 대문자여야 합니다.
3. 여러 단어가 합쳐진 변수명 이라면 단어의 시작은 대문자로 합니다. 단, 변수명의 첫 시작은 소문자 입니다.
예시) saveMembers, lastIndexOf
4. 상수(지금 선언한 값에서 절대 변할 수 없는 값)의 이름은 대문자가 권장사항 입니다. 단어 사이의 구분자는 언더바(_) 입니다.
예시) MIN_NUMBER, LAST_NAME

클래스 작성 케이스

  • 카멜케이스
    totalScore
  • 파스칼 케이스 (클래스 작성할 때 권장)
    TotalScore
  • 케밥케이스
    total-score
  • 스네이크 케이스
    total_score

코딩 컨벤션
[JAVA] Google Java Style Guide 요약 번역

  1. 자바에서 변수에 대한 설명 중 틀린 것은? 4
(1) 자바에서의 변수 선언은 어떤 타입의 데이터를 저장할것인지, 
	변수 이름이 무엇인지를 결정한다.
	타입 변수명 = 초기값 세팅;
    
(2) 변수는 선언 시 사용한 타입의 값만 저장할 수 있다.
    
(3) 변수는 변수가 선언된 중괄호{} 안에서만 사용 가능하다.
    
(4) 변수는 초기값이 저장되지 않은 상태에서 읽을 수 있다.
  1. 변수 이름으로 사용이 가능한 것을 모두 고르세요 1 4 5 6
 (1) className - 카멜 케이스로 적은 변수명. 웬만하면 이런 평이한 형식으로 작성.
    
 (2) class - 예약어로 변수명으로 사용 x
    
 (3) 6hour - 앞에 숫자로 시작해서 변수명으로 사용 x
    
 (4) $value - 변수명으로 사용 가능하지만 해당 변수명은 조금 지양하도록
    
 (5) _age - 변수명으로 사용 가능
    
 (6) at - 변수명으로 사용 가능

변수의 타입

타입의 종류

정수타입 - byte, short, int, long, float, double, boolean
참조타입 - Class, Array, Enum

기본 타입 (원시:primitive type) 중요! 잘 알아두기

자바의 변수 타입은 매우 엄격
1 byte = 8 bit
bit는 0과 1이라는 데이터로 구성

각각의 자리는 1과 0으로 채울 수 있음. 즉 2의 8승 > 256가지 숫자

값의 종류기본 타입메모리 사용 크기저장되는 값의 범위
정수byte1byte-128 ~ 127
정수, 문자char2byte0 ~ 65535
정수short2byte-32,768 ~ 32,767
정수int4byte-2,147,483,648 ~ 2,147,483,647
정수long8byte–9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
실수float4byte3.4E+/-38(7개의 자릿수)
실수double8byte1.7E+/-308(15개의 자릿수)
논리형boolean1bytetrue, false (1,0)

정수타입

정수 타입을 메모리 사용 크기 순서대로 나열하면 다음과 같음.

byte (1byte) < char (2byte) < short (2byte) < int (4byte) < long (8byte)

  • byte 타입

    아래의 for문으로 확인 하는 방법도 있고 해당 방법처럼 확인 하는 방법도 있음

    129가 byte에 담을 수 없어서 int를 써서 담으라는 제안

    package chap01;
    
    public class GarbageValueExample {
        public static void main(String[] args) {
            byte a = 127; // -128 ~ 127
            int b = 127; // +- 20억 이것보다 숫자가 크면 long
            for (int i = 0; i < 5; i++) { // i = 0 ~ 4
                a++; // a = a + 1
                b++;
                System.out.println(i + " a = " + a);
                System.out.println(i + " b = " + b);
            }
        }
    }

    결과값

    0 a = -128 // byte는 127 이상으로 표현 할 수 없기에 쓰레기값이 할당 되었음.
    0 b = 128 // int는 127 이상으로 표현 가능하여 정상적으로 노출되는 것을 확인 가능
    1 a = -127
    1 b = 129
    2 a = -126
    2 b = 130
    3 a = -125
    3 b = 131
    4 a = -124
    4 b = 132

    또 다른 테스트

    package chap01;
    
    public class GarbageValueExample {
        public static void main(String[] args) {
            byte a = 127; // -128 ~ 127
            int b = 127; // +- 20억 이것보다 숫자가 크면 long
            int c = 2147483647; //
            long d = 2147483647; //
            for (int i = 0; i < 5; i++) { // i = 0 ~ 4
                a++; // a = a + 1
                b++;
                c++;
                d++;
                System.out.println(i + " a = " + a);
                System.out.println(i + " b = " + b);
                System.out.println(i + " c = " + c);
                System.out.println(i + " d = " + d);
            }
        }
    }

    결과값

    0 a = -128
    0 b = 128
    0 c = -2147483648
    0 d = 2147483648
    1 a = -127
    1 b = 129
    1 c = -2147483647
    1 d = 2147483649
    2 a = -126
    2 b = 130
    2 c = -2147483646
    2 d = 2147483650
    3 a = -125
    3 b = 131
    3 c = -2147483645
    3 d = 2147483651
    4 a = -124
    4 b = 132
    4 c = -2147483644
    4 d = 2147483652
  • char 타입
    정수형도 문자형도 저장 가능하지만 문자형을 자주 사용

    // 문자 
    char ch = 'C';
    
    // 문자열 - String이라는 참조타입으로 저장할 수 있음.
    String str2 = ""; // 문자열을 초기화 한다~
    String str = "값을 표현할 수 있습니다.";
  • int 타입

    4byte(32bit)로 표현

    -2147483648 ~ 2147483647

    실무에서 정수값을 int 타입으로 가장 많이 사용하고, 21억이 넘어가는 큰 범위의 숫자는 long타입 사용.

  • long 타입

    8byte(64bit)로 표현되는 정수값을 저장할 수 있는 타입

    -9223372036854775808 ~ 9223372036854775807

    은행, 우주와 관련된 프로그램에서 많이 사용

    int에서 표현할 수 있는 4byte를 넘어가면 표시해 주는게 좋다.

    package chap02;
    
    public class VariableExample {
        // long 타입
        public static void main(String[] args) {
            // psvm 치면 해당 구문 나옴, 익숙해질때까진 타이핑
            int a = 1;
            int b = 1000000000; // int에 담을 수 있는 값이라 오류 x
            int b = 10000000000; // int에 담을 수 없는 값이라 오류
            int b = 10000000000L; // 정수 타입이 long이 아니어서 오류
    				long b = 10000000000L; // 오류 해결
    
            long longValue = 100; // (int -> long 자동 변환됨)
            long longValue2 = 10000000000L; // 100억, 지금 기본적으로 int 정수형을 생각해서 오류를 띄우고 있음. -> int형이 아니라 long 타입이라는 표식을 해줘야함 - 숫자 뒤에 L을 적으면 초기회됨.
    
        }
    }

실수타입

소수점이 있는 숫자를 실수
float(4byte) < double(8byte)
자바는 기본적으로 double을 사용하여 float를 사용하여 실수값을 저장하려면 값 뒤에 f 나 F 를 붙여주면 된다. 이때 소문자도 사용할 수 있지만 구분을 뚜렷하게 하기 위해 대문자로 적어준다.

double var1 = 3.14;
float var2 = 3.14F;

package chap02;

public class VariableExample {
    public static void main(String[] args) {
        // psvm 치면 해당 구문 나옴, 익숙해질때까진 타이핑

        //float, double 타입
        float floatValue = 1.01234F;
        double doubleValue = 1.1234;

        //System.out.println(); sout 치면 해당 구문 바로 나옴, soutv 치면 바로 위의 값을 넣어서 나옴
        System.out.println(floatValue);
        System.out.println(doubleValue);
    }
}

//결과값
1.01234
1.1234

소수점의 정밀도 차이

double이 더 정밀한 소수점이 표현 가능

package chap02;

public class VariableExample {
    public static void main(String[] args) {
        float floatValue2 = 0.1234567890123456789F;
        double doubleValue2 = 0.1234567890123456789;

        System.out.println(floatValue2);
        System.out.println(doubleValue2);
    }
}

//결과값
0.12345679 // 0.12345678자리까지 나오고 뒷자리에서 반올림
0.12345678901234568 // 0.12345678901234567자리까지 나오고 뒷자리에서 반올림

논리타입

boolean 값은 1byte(8bit)로 표현되는 논리값 (true/false)을 저장할 수 있는 데이터 타입

public static void main(String[] args){
		boolean stop = true;
		if (stop) {
			System.out.println("중지합니다!"); // 해당 문구 노출
		} else {
			System.out.println("시작합니다!");
		}
}

// 여기서 시작합니다!를 노출시키려면
// stop의 할당값을 false로 바꾸거나 if(stop)를 if(!stop)로 바꾸면 된다.

퀴즈풀기 8/30

  1. serialNo는 15자리의 숫자로 이루어져 있습니다. serialNo 변수를 선언하는 한 줄의 코드를 적으세요.
public class Question {
    public static void main(String args[]) {
      /*
       * serialNo는 15자리의 숫자로 이루어져 있습니다.
       * serialNo 변수를 선언하는 한 줄의 코드를 적으세요.
       */
      System.out.println(serialNo);
    }
}
long serialNo = 100000000000000L;
  1. 다음 문장들의 출력 결과를 확인해보세요
public class Question {
    public static void main(String args[]) {
        // 다음 문장들의 출력 결과를 확인해보세요.
        System.out.println("10" + "04");
        System.out.println("" + false);
        System.out.println('a' + 100);
    }
}
1004
false
197
  1. 에러가 발생하는 부분을 고쳐보세요.
public class Question {
    public static void main(String args[]) {
        // 에러가 발생하는 부분을 고쳐보세요.
        byte a = 999;
        char b = 'abc';
        float c = 1.23d;
    }
}
int a = 999;
String b = "abc";
float c = 1.23F;
  1. 다음 중 기본 자료형(primitive type)이 아닌 것은?
    1. int
    2. String
    3. boolean
    4. short
2 참조 자료형
  1. char 타입에 저장할 수 있는 정수 값의 범위는?
2byte , 0~65535
  1. 다음 중 변수를 잘못 초기화한 것을 모두 고르세요.
    1. int a = 1;
    2. char b = '';
    3. char c = 'Hello';
    4. byte d = 12345;
2. char b = ' ';
3. String c = "Hello";
4. int d = 12345;
  1. 다음 수식의 결과 값과 타입은?
    1. 100 + 10.5
    2. 100 / 5
    3. 10.0 / 5
int example7Value1 = 100;
float example7Value2 = 10.5F;
float example7Value3 = 10.0F;
int example7Value4 = 5;

System.out.println(example7Value1 + example7Value2)
System.out.println(example7Value1 / example7Value4)
System.out.println(example7Value3 / example7Value4)

// 결과값
110.5
20
2.0
  1. ‘가’라는 한글 문자의 유니코드를 찾아서 char 타입의 변수로 만들어봅시다.
char example8Value = '\uac00';
System.out.println(example8Value);

//결과값
  1. 아래 코드는 변수 x, y, z의 값을 서로 바꾸는 예제입니다. 실행 결과처럼 출력되도록 빈칸에 알맞은 코드를 넣어주세요.
public class ChangeNumbers {
    public static void main(String[] args) {
        int x = 1;
        int y = 20;
        int z = 300;

        // 코드를 작성해주세요 

        System.out.println("x = " + x);
        System.out.println("y = " + y);
        System.out.println("z = " + z);
    }
}

<실행결과>

x = 20
y = 300
z = 1
int tmp;
tmp = x;
x = y;
y = z;
z = tmp;
profile
goldsong

0개의 댓글