Java 기본 문법 1

귀찮Lee·2022년 5월 8일
0

Java

목록 보기
1/15

◎ Java의 특징

  • Java의 특징

    1. 운영체제의 독립적

      • 특정 OS에 따라 다르게 작성하지 않음
      • OS가 달라도, JVM을 통해 기계어로 번역해줌
    2. 객체지향 언어(Object Oriented Programming, OOP)

      • 모든 기능은 "객체"를 생성해서 실행함
      • 유지 보수가 용이, 확장성이 좋음
    3. 함수형 프로그래밍 지원

      • Java 8버전부터 함수형 프로그래밍을 지원하는 람다식과 스트림이 추가
        -> 추후 알아보자.
    4. 자동 메모리 관리

      • C++ 을 개선하여 자동으로 메모리를 관리해주는 기능을 추가
      • 가비지 컬렉터(Garbage Collector)를 통해 사용하지 않는 메모리를 수거
  • JVM과 JDK

    • Java는 컴파일러(Compiler)를 통해 기계어(Machine Language)로 변환되는 언어이다.

    • 파일이 실행되는 과정
      Source Code (.java file)
      -> Compiler (javac)
      -> Bytecode (.class file)
      -> JVM(Java Virtual Machine) : Bytecode를 운영체제에 맞게 기계어로 변환해줌

    • Java 설치 관련 도구

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

◎ 타입(Type)

  • 타입의 종류

    • 기본 타입(primitive type)
      • 데이터의 실제 값을 의미
      • byte, short, int, long, float, double, char, boolean
      • 값을 출력할 때, 데이터 값이 나옴
    • 참조 타입(reference type)
      • 기본 타입을 제외한 모든 타입(클래스)
      • 데이터가 저장된 주솟값을 의미함(객체의 주소를 저장)
      • 값을 출력할 때, 대체적으로 객체의 주솟값이 나옴 ex) java.lang.Object@42bae8e6
  • 정수 타입 byte, short, int, long

    • byte (1byte), short (2byte), int (4byte), long (8byte)
    • long 타입 할당시에는 뒤에 " L "을 붙여서 할당할 것
    long longNum = 6846611631L;
    • 변수값이 해당 타입의 범위를 넘을경우, 오버플로우(overflow) 또는 언더플로우(underflow)가 발생함
    byte overflow = 127;
    overflow++;
    System.out.println(overflow); // -128
    
    byte underflow = -128;
    underflow--;
    System.out.println(underflow); // 127
  • 실수 타입(float, double)

    • float(4byte), double(8byte)
    • 할당시, float는 " f " double는 " d " 를 붙임 (소수 작성시, double가 기본값)
    float floNum = 2.7f;
    double douNum1 = 2.7172714d;
    double douNum2 = 2.7172714;
    • 부동소수점 표현 방식으로 저장함 (효율적이지만 약간의 오차를 가짐)
    • double 타입이 더 큰 실수 저장 가능, 더 정확하게 저장 가능
  • 논리타입(boolean)

    • boolean(1byte)
    • 0과 1로 표현하므로 1bit로 표현가능 / JVM의 데이터 최소 단위가 1byte
  • 문자타입(char)

    • 하나의 문자만 저장할 수 있음 (문자열,String 과는 다른 개념, 2byte)
    • 작은따옴표 ( ' ) 로 문자를 감싸서 할당함
    • 유니코드를 기반으로 문자를 표현, 문자에 해당하는 정수값을 저장
    char letterBasic = 44032; // '가'의 유니코드값 
    System.out.println(letterBasic); // '가'가 출력
    
    int charToInt
    char nine = '9';
    chatToInt = nine - '0';
    System.out.println(charToInt) // 9 (유니코드상 '0'과 '9'는 9 차이남)
  • 타입 변환

    • 자동 타입 변환
      • 대체적으로 바이트 크기가 작은 타입에서 큰 타입으로 변환할 때
      • 덜 정밀한 타입에서 더 정밀한 타입으로 변환할
      long longValue = 12345L;
      float floatValue = longValue;
    • 수동 타입 변환
      • 바이트 크기가 큰 타입에서 작은 타입으로 갈 때 등등
      int intValue = 128;
      byte byteValue = (byte)intValue;
      • 이외 참조 타입에서는 메서드를 이용할 수 있음. (필요할 때마다 구글링 필요)
      StringBuilder sb = new StringBuilder("abc");
      String com3 = sb.toString();

◎ 문자열(String)

  • 문자열은 참조타입이므로

    1. String 객체로 생성하고,
    2. 변수에는 이 객체의 주소를 참조함.
    • 문자열을 String 변수에 참조한다. ( X )
  • 문자열 리터럴로 생성을 하느냐, new 키워드로 생성을 하느냐에 따라 비교 연산자(==)의 결과는 달라질 수 있다.

  • 문자열 생성시에서는 기본적으로 리터럴로 생성하는 것을 추천 (같은 객체를 가리키므로 그만큼 메모리를 아낄 수 있음)

String s1 = "Cat"; // 
String s2 = "Cat"; // letter1과 동일한 문자열 리터럴
String s3 = new String("Cat"); // new 키워드로 String 객체를 별도로 생성

System.out.println(s1 == s2); // true
System.out.println(s1 == s3); // false

// String 객체 값을 비교할 때는 .equals 를 이용
System.out.println(s1.equals(s3)); // true

int year = 2022;
int month = 5;
int day = 8;

// + 기호를 이용해 합침  // 더해질 떄마다, 인스턴스 생성과정이 들어가므로 메모리를 매우 많이 잡아먹음 (비추)
// 해당 작업을 많이 할 때는 StringBuilder, StringBuffer를 사용하는 것을 추천
String com1 = Integer.toString(year) + "년 " + Integer.toString(month) + "월 " + Integer.toString(day) + "일";
System.out.println(com1);

// String.format을 이용해 표현
String com2 = String.format("%d년 %d월 %d일", year, month, day);
System.out.println(com2);

// StringBuilder를 통해 합침 (여유 공간을 만들어 할당함 -> + 대신 사용하기 좋음)
StringBuilder sb = new StringBuilder();
sb.append(year).append("년 ").append(month).append("월 ").append(day).append("일");
String com3 = sb.toString();
System.out.println(com3);
  • StringTokenizer

    • 문자열을 우리가 지정한 구분자로 문자열을 쪼개주는 Class
    • 링크 참고
  • StringBuilder

    • +기호를 사용하여 합쳐질 때마다 인스턴스 생성과정이 일어나므로 메모리 사용이 매우 비효율적
    • 이를 대체하기 위해 StringBuilder 사용 (위의 예제 참고)
  • StringBuffer

    • String 클래스의 인스턴스는 한번 생성되면 읽기만 할 수 있고, 변경할 수 없음
    • StringBuffer 클래스의 인스턴스는 값을 변경, 추가 가능
      • StringBuffer 클래스는 내부적으로 버퍼(buffer)라고 하는 독립적인 공간을 가짐.
      • 버퍼 크기의 기본값은 16개의 문자를 저장할 수 있는 크기이며, 생성자를 통해 그 크기를 별도로 설정할 수 있음.
      • 하지만 인스턴스 생성 시 사용자가 설정한 크기보다 언제나 16개의 문자를 더 저장할 수 있도록 여유 있는 크기로 생성됨.
StringBuffer str = new StringBuffer("12345");

System.out.println(str.append("678")); // 12345678 특정 문자열 추가
System.out.println(str.delete(5, 7));  // 123458 특정 부분 문자열 제서
System.out.println(str.deleteCharAt(2)); // 12458 특정 부분 문자 제거
System.out.println(str.insert(2, "3")); // 123458 특정 부분 문자 추가
System.out.println(str); // 123458
System.out.println(str.capacity()); // 21 인스턴스의 현재 버퍼 크기

◎ 변수, 상수, 리터럴

  • 변수 : 데이터의 저장 공간을 의미

    • 변수 사용 이유

      • 메모리에 데이터의 저장 공간 확보
      • 협업 시, 데이터에 이름을 붙여 소통
      • 데이터를 재사용
    • 변수 선언과 할당

    int letter // 변수 선언
    letter = "abc" // 변수 할당
    int letter = "abc" // 변수 초기화 (선언+할당)
    • 변수명
      • 변수명은 주로 camelCase로 지음 ex) largestNumber
      • 명명 규칙 : 숫자로 시작하는 변수명, 자바에서 이미 사용중인 예약어는 사용 불가
      int 10Age; // (X)
      int byte; // (X)
      int char; // (X)
  • 상수 : 변하지 않는 수(고정값)

    • Java에서 상수는 final 예약어를 사용하여 선언 (변경불가)
    • 대체적으로 상수는 SCREAMING_SNAKE_CASE를 사용하여 명명함
    final String MY_NAME = "gwichanLee"; 
  • 리터럴 : 문자가 가리키는 값 그 자체를 의미함

    • 리터럴 값과는 다른 개념 / 값은 리터럴이 평가되어 만들어진 일종의 결과
    • 리터럴은 평가되어 리터럴이 가리키는 문자 그대로의 값을 생성하니, 리터럴은 곧 값 그 자체다

◎ 콘솔 입출력

  • 콘솔창 입력
import java.util.Scanner;

Scanner scanner = new Scanner(System.in); // Scanner 클래스의 인스턴스를 생성
String inputValue = scanner.nextLine();   // 입력한 내용이 inputValue에 저장
System.out.println(inputValue);           // 입력한 문자열이 출력
  • 콘솔창 출력
System.out.print("Hello World"); // 소괄호 안의 내용 출력, 줄바꿈X
System.out.println("Hello World"); // 소괄호 안의 내용 출력, 줄바꿈O
System.out.printf("%s %s%n", "Hello", "World"); // String.format 형식으로 출력
profile
배운 것은 기록하자! / 오류 지적은 언제나 환영!

0개의 댓글