Java 기본 문법

hyoreal·2022년 8월 24일
0

[JAVA]

목록 보기
1/11
post-thumbnail

Java의 특징

  1. 운영체제의 독립적

    • JRE(Java Runtime Environment)가 설치되어 있는 모든 운영체제에서 실행 가능.
    • JRE : JVM(자바 가상머신) + 표준 클래스 라이브러리.
  2. 객체 지향 언어(Object Oriented Programming, OOP)

    • 모든 기능은 객체로 만들어 사용.
    • 유지보수가 쉽고 확장성이 높다.
  3. 함수형 프로그래밍 지원

    • 자바 8버전부터 함수형 프로그래밍 지원 문법인 람다식, 스트림 추가.
  4. 자동 메모리 관리(Garbage Collection)

    • 자바는 가비지 컬렉터(Garbage Collertor)를 실행시켜 메모리 관리 수고를 덜어 핵심 코드에 집중할수 있다.

JVM과 JDK

  • JVM(Java Virtual Machine)

    • 자바는 컴파일러를 통해 기계어로 변환되는 언어.
      • 컴파일 : 특정 프로그래밍 언어를 기계어로 번역하는 과정.
      • .java file → javac → .class file → JVM → OS
    • JVM : 자바 프로그램 실행 도구. Bytecode를 OS에 맞게 기계어로 변환.
  • Java 설치 관련 도구

    • JRE(Java Runtime Enviroment) : JVM + 표준 클래스 라이브러리
    • JDK(Java Development Kit) : JRE + 개발에 필요한 도구

타입(Type)

  • 기본타입(primitive type)

    • 값 저장 시, 데이터의 실제 값 저장
    • 정수타입 byte(1byte), short(2byte), int(4byte), long(8byte)
      • long 타입 할당 시 뒤에 'L' 붙여서 할당.
    long longNumber = 1234567890L;
    자료형크기데이터타입범위
    byte1byte정수-128 ~ 127
    short2byte정수-32,768 ~ 32,767
    int4byte정수-2,147,483,648 ~ 2,147,483,647
    long8byte정수-9,223,372,036,854,775,807 ~ 9,223,372,036,854,775,807

    • 언더플로우 < 타입범위 < 오버플로우

    byte underflow = -128;
    underflow--;
    System.out.println(underflow); // 127
    
    byte overflow = 127;
    overflow++;
    System.out.println(overflow); // -128
    • 실수 타입 float(4byte), double(8byte)

      • 값 할당 시, float는 뒤에 'f', double은 'd'를 붙임.(단, double은 생략 가능)


      float floatNumber = 5.5f;
      double doubleNumber = 5.5555d; // 5.5555 가능
      자료형크기데이터타입범위
      float4byte실수(부동 소수점수)+-1.5 * 10-⁴⁵ ~ +- 3.4*10³⁸
      double8bytefloat보다 2배 정밀한 실수+-5.0*10-³²⁴ ~ 1.7*10³⁰⁸

    • 논리타입 boolean(1byte)

      • 0과 1로 표현하므로 1bit로 표현 가능
      • JVM의 데이터 최소 단위가 1byte

    • 문자타입 char(2byte)

      • 유니코드기반
      • 하나의 문자만 저장 가능 (ex, 'a')
      • 작은 따옴표만 사용
  • 참조타입(reference type)

    • 값 저장 시, 데이터의 주소 값 저장
    • 객체 주소 저장, 8개의 기본형 제외한 나머지 타입(클래스)
  • 타입 변환

    • 자동 타입 변환

      • 타입크기가 작은 타입에서 큰 타입으로의 변환
      • 덜 정밀한 타입에서 더 정밀한 타입으로의 변환
      byte byteValue = 10;
      int intValue = byteValue;
    • 수동 타입 변환

      • 타입 크기가 큰 타입에서 작은 타입으로의 변환 등
      long longNum = 1;
      byte byteNum = (byte)longNum;
      • 참조타입에서의 메서드 사용 가능
      StringBuilder sb = new StringBuilder();
      sb.append("Hello ");
      sb.append("World!");
      
      String hw = sb.toString(); // Hello World! 출력

문자열(String)

  • 문자열은 참조타입
  • 문자열은 되도록 리터럴로 생성.
String str1 = "apple" // 리터럴
String str2 = "apple; // 리터럴
String str3 = new String("apple"); // new 키워드로 문자열 객체 생성

System.out.println(str1 == str2); // true
System.out.println(str1 == str3); // false

System.out.println(str1.equals(str3)); // true

연산자

산술연산자기능비교연산자기능
+더하기n < m / n > mn이 m보다 작다/n이 m보다 크다
-빼기n <= m / n >= mn과 m이 작거나(크거나) 같다
*곱하기n == mn과 m이 같다
/나누기n != mn과 m이 다르다 (not 연산자)
%나머지n && mn과 m (and 연산자)
--n ⅼⅼ mn 혹은 m (or 연산자)
  • 증감연산자
num++; // num + 1; 과 같다
num--; // num - 1; 과 같다

// 단, 위치에 따라 연산순서가 달라진다.

int num1 = 10;
System.out.println(num1++); // 10 출력 (후위형 증감연산자)

num1 = 10;
System.out.println(++num1); // 11 출력 (전위형 증감연산자)
  • 후위형 증감연산자 : 기존의 값으로 코드를 먼저 실행시킨 다음에 증감연산 수행
  • 전위형 증감연산자 : 증감연산을 먼저 수행시킨 다음, 결과값으로 코드를 실행
  • 삼항연산자
    조건식 ? 조건식이 true일때 실행문 : 조건식이 false일때 실행문

  • 연산자 우선순위

    우선순위연산자내용
    1() , []괄호, 대괄호
    2!, ~ , ++ , --부정 / 증감 연산자
    3*, / , %곱셈 / 나눗셈 연산자
    4< , <= , > , >=대소 비교 연산자
    5&&AND 연산자
    6ⅼⅼOR 연산자
    7? :삼항연산자
    8= , += , -= , /= , %=대입 / 할당 연산자

콘솔입출력

  • 콘솔출력

    • 단순 출력 System.out.print()

      System.out.print("Hello World");
      System.out.print("Nice to meet you!);
      
      > 출력
      > Hello WorldNice to meet you!
    • 줄바꿈 출력 System.out.println()

      System.out.println("Hello World");
      System.out.println("Nice to meet you!);
      
      > 출력
      > Hello World
      > Nice to meet you!
    • 형식 출력 System.out.printf()

      • printf에서의 f는 formatted 의 약자로, 출력할 형식을 지시해줄수 있다.

    지시자출력 포맷
    %bBoolean
    %d10진수
    %o8진수
    %x,%X16진수
    %c문자
    %s문자열
    %n줄바꿈
System.out.printf("%s%n%s", "Hello World", "Nice to meet you!");
System.out.printf("지금은 %d년 %d월 %d일 입니다.", 2022, 8, 24);
        
> 출력
> Hello World
> Nice to meet you!지금은 2022824일 입니다.
// Nice to meet you! 와 지금은 ~ 입니다가 붙어서 출력된 이유?
// 줄바꿈"%n"을 사용하지 않았기 때문!
        
System.out.printf("%s%n%s%n", "Hello World", "Nice to meet you!");
System.out.printf("지금은 %d년 %d월 %d일 입니다.", 2022, 8, 24);
        
> 출력
> Hello World
> Nice to meet you!
> 지금은 2022824일 입니다.
  • 콘솔 입력
import java.util.Scanner; // (1)

Scanner s = new Scanner(System.in); // (2)
String input = s.nextLine(); // (3)

System.out.println(input); // (4)
  1. java.util에 저장되어있는 데이터 입력 프로그램 Scanner을 불러온다.
  2. Scanner 클래스로 객체를 생성한다.
    • 객체를 생성할때 new 연산자를 통해 생성하는데 이는 추후 정리할 예정.
  3. 입력받은 데이터를 변수 input에 할당한다.
    • 타입은 그때마다 변경가능하다.
    • 타입마다 nextline(), nextInt(), nextFloat() 등을 사용한다.
  4. 입력받은 데이터를 출력한다.

조건문

  • 특정 조건 해당시 특정 부분만 실행 가능
  • if - else 문
    if (조건식1) {
    	// 조건식1이 true일때 실행되는 실행문
    } else if (조건식2) {
    	// 조건식1은 false이고 조건식2는 true일때 실행되는 실행문
    } else {
    	// 위 모든 조건이 false일때 실행되는 실행문
        // 생략 가능
    }
    • 조건식은 boolean값으로 평가되어야한다
    • {}를 블록이라고도 하는데 블록에 들어가는 식이 한줄일 경우 {} 생략 가능
    if (5 < 10) {
       return true;
    } else {
       return false;
    }
      
    ---------------------
      
    if (5 < 10) return true;
    else return false;
      
    // 위 두 코드는 같다.

  • switch 문
    • if - else 문과 달리 조건문이 아닌 변수가 어떤 값을 갖느냐에 따라 실행문이 작동한다.
    • break;를 적어주면 밑의 case를 실행하지 않고 반복문을 빠져나간다
    • default는 모든 case에 해당하지 않으면 실행한다
public class Main {
	public static void main(String[] args) {
    int randomNum = (int)(Math.random() * 10) + 1; // 1 ~ 10 까지 랜덤으로 숫자 뽑기
    
    switch (randomNum) {
    	case 1 :
        	System.out.println("1입니다");
            break;
        case 2 :
        case 3 :
        	System.out.println("2랑 3입니다");
        case 4 :
        	System.out.println("4도 있어요!");
            break;
        default :
        	System.out.println("5 ~ 10입니다");
     }

반복문

  • for 문

    • 조건문이 true인 동안 계속 반복
    • 반복할 횟수를 알고있는 경우 사용하면 좋다
    for (int i = 0; i < 100; i++) {
    	실행문
    }
  • 향상된 for문

    • 배열 요소를 순회하는 경우 사용하기 좋다
    int[] nums = {1, 2, 3, 4, 5};
    for (int num : nums) {
    	실행문
    }
  • while 문

    • 반복횟수를 모를 때 사용하면 좋다
    • 조건문이 true인 동안 계속 반복
    int num = 0;
    while(num < 10) {
    	num++;
    }
  • do - while 문

    • do는 무조건 한번 실행 후 while문 실행
    do {
    	System.out.println("무조건 1번 실행");
    } while (num < 10) {
    	num++;
    }
  • break : 반복문 종료

  • continue : 다음 반복 실행

배열

  • 배열의 선언

    int[] arr1;
    String[] strArr[];
  • 배열의 할당

    // 선언 + 초기화
    int[] arr1 = new int[5]; // 기본값은 0이므로 현재 {0, 0, 0, 0, 0}
    String[] strArr1 = new String[5]; // 기본값은 null이므로 현재 {null, null, null, null, null}
    // []에 수를 지정하는건 배열 요소의 개수를 지정해주는것
    
    
    // 선언 + 초기화 + 값 할당
    // 두가지 방법이 있다
    int[] arr2 = new int[] {1, 2, 3, 4, 5};
    int[] arr3 = {1, 2, 3, 4, 5};
    
    String[] strArr2 = new String[] {"apple", "kiwi", "melon", "mango", "berry"};
    String[] strArr3 = {"apple", "kiwi", "melon", "mango", "berry"};
    
    // 선언 따로 할당 따로
    int[] arr4;
    arr4 = {1, 2, 3, 4 5};
  • 배열 길이, 인덱스

    int[] arr1 = {1, 2, 3, 4, 5};
    
    System.out.println(arr1.length);
    System.out.println(arr1[4]);
    
    > 출력
    > 5
    > 5
    // 인덱스는 1이 아니라 0부터 시작한다.
    // 즉, arr1 배열을 예로 들면
    // { 1, 2, 3, 4, 5} 각 요소들의 인덱스는
    //   0  1  2  3  4  인 것이다

    주의❗

  • 문자열의 길이

    • 문자열의 길이를 구할때는 length() 이다
    String str = "Hello";
    
    System.out.println(str.length());
    
    > 출력
    > 5
  • 다차원배열

    • 다차원배열에서 2차원 배열은 표와 비슷한 형태
    int[][] arr; // 2차원 배열
    int[][] arr1 = new int[3][3];
    /*{
    {0, 0, 0},
    {0, 0, 0},
    {0, 0, 0}
    }*/
    • 가변배열 : 내부배열의 길이를 정하지않음
      int[][] arr = new int[5][];
profile
좌충우돌 코린이 성장기

0개의 댓글