곰돌이볼 2022. 8. 30. 09:11

📄 학습내용

Java

  • 객체지향 프로그래밍 언어, 세계에서 가장 인기 있는 언어
  • 특징
    • 운영체제와 독립적으로 동작 : JRE(JVM+표준 라이브러리)로 인해 모든 운영체제에서 동작
    • 객체지향언어
    • 함수형 프로그래밍 지원 : 람다식, 스트림 지원
    • 자동 메모리 관리 : 가비지 컬렉터가 쓰지 않는 메모리 회수
  • JVM
    • 자바 컴파일이란?
      • 자바 코드를 JVM이 이해할 수 있는 언어로 변환 
    • JVM은 운영체제가 이해할 수 있는 기계어로 변환해서 운영체제와 독립적으로 동작 가능
    • C, C++과 달린 JVM를 거치기 때문에 속도가 느린 편
  • JRE(Java Runtime Environment) : JVM + 표준 클래스 라이브러리 → 자바 프로그램 실행
  • JDK(Java Development Kit) : JRE + 개발에 필요한 도구 → 자바 프로그램 개발
  • 메서드 : 입력을 받아 과정을 통해서 결과를 반환
접근제어자 반환타입 메서드이름(매개변수타입 매개변수이름) {
    메서드바디
}
  • 메서드 호출
메소드이름(인자)
  • 진입점 메서드
    • 프로그램을 실행할 때 가장 먼저 실행되는 메서드
  • main 메서드
    • 진입점 메서드로 자바 소스코드에는 반드시 main 메서드가 있어야 함

 

의사코드

  • 의사코드(pseudo code) : 소스 코드를 작성하기 전, 흐름을 언어로 먼저 작성하는 것
  • 계획적인 코드 작성 가능

 

Java 변수, 상수, 리터럴

  • 변수
    • 프로그래밍할 때 필요한 임시 데이터를 저장하는 것
    • = : 대입 연산자
    • 선언  : 타입 변수명;
    • 할당(또는 대입) : 변수명 = 값;
    • 초기화 : 선언한 변수에 처음으로 값을 할당하는 것
    • 변수 명명 규칙
      • 영어 대소문자, 숫자, _, $ 이용
      • 대소문자 구분
      • 숫자로 시작할 수 없음
      • 예약어를 사용할 수 없음
  • 상수
    • 초기화 후 변경이 되지 않는 것
    • final 예약자를 이용
    • 관례적으로 대문자 사용
  • 리터럴
    • 문자 그 자체
    • ex) int num = 10; 이라는 문장에서 num의 값 10이 리터럴이다.

 

Java 데이터 타입

  • 타입(type)?
    • 어떤 데이터값의 유형과 종류에 따른 메모리 크기와 저장되는 방식
  • 오버플로우 & 언더플로우
    • 타입의 표현 범위를 넘어가면 발생하는 문제점으로, 표현 범위를 넘어가면 오버플로우, 표현 범위보다 작으면 언더플로우라고 한다.
  • 값이 저장되는 방식
    • 기초 타입
      • 저장되는 값 = 실제값 
      • 정수 타입
        • byte : 1byte, -27 ~ 27-1
        • short : 2byte, 215 ~ 215-1
        • int : 4byte, 231 ~ 231-1
        • long : 8byte, 263 ~ 263-1, 선언할 때 값 뒤에 L을 붙임
        • 정수 타입의 오버플로우 & 언더플로우
          • 양수 표현 범위를 넘어가면 오버플로우 발생하고, 값은 음의 최소 범위로 넘어감
          • 음수 표현 범위를 넘어가면 언더플로우 발생하고, 값은 양의 최대 범위로 넘어감
      • 실수 타입
        • float
          • 4byte
          • 음수 : -3.4*1038 ~ -1.4*10-45
          • 양수 : 1.4*10-45 ~ 3.4*1038
          • 정밀도 7자리
        • double
          • 8byte
          • 음수 : -1.8*10308 ~ -1.4*10-324
          • 양수 : 4.9*10-324 ~ 1.8*10308
          • 정밀도 15자리
        • 부동소수점 표현 방식
        • 실수 타입의 오버플로우 & 언더플로우
          • 음의 최소 범위 또는 양의 최대 범위를 넘어가면 오버플로우가 발생하고, 값은 무한대가 됨
          • 음의 최대 범위와 양의 최소 범위 사이에 값이 가면 언더플로우가 발생하고, 값은 0이 됨
      • 논리 타입
        • boolean : true, false
        • boolean 값은 1byte를 가짐
      • 문자 타입
        • char : 하나의 문자만 저장
        • char 값은 2byte를 가짐
        • 유니코드 이용
    • 참조 타입
      • 저장되는 값 = 값이 젖ㅇ아되어 있는 메모리 주소값
      • 기초 타입을 제외한 모든 타입
  • 형변환
    • 자동 타입 변환 : 작은 타입에서 큰 타입으로 변환할 때 자동으로 형변환이 일어남
    • 수동 타입 변환 : 큰 타입에서 작은 타입으로 변활할 때에는 자동으로 형변환이 일어나지 않아서 직접 타입을 변환해야 함

 

문자열(String) 클래스

  • String 변수 선언 및 할당
String str1 = "Test01";
String str2 = new String("Test02");
  • 값을 직접 할당한 경우, 같은 값을 가지는 문자열 변수가 있으면 같은 참조값을 가진다.
  • String 클래스의 메서드
    • boolean equals(String str)
      • str의 문자열 내용과 비교했을 때, 같으면 true를 반환하고 다르면 false를 반환
    • char charAt(int index)
      • 문자열의 index 번호에 있는 문자 출력
    • int compareTo(String str)
      • 두 문자열을 비교하는 메서드
      • 두 문자열이 같으면 0 반환, 비교하는 문자열이 인수로 들어온 문자열보다 작으면 음수 반환, 비교하는 문자열이 인수로 들어온 문자열보다 크면 양수 반환
    • int compareToIgnoreCase()
      • 문자열의 대소문자와 상관없이 비교하는 메서드
    • String concat(String str)
      • 추가 문자열 str를 추가해서 문자열 뒤에 붙여서 반환
    • int indexOf(String str)
      • 특정 문자 또는 문자열 str이 처음으로 등장하는 인덱스 반환, str이 포함되지 않으면 -1 반환
    • String trim()
      • 문자열의 앞 뒤에 포함된 공백 문자를 제거해서 반환
    • String toLowerCase()
      • 문자열을 전부 소문자로 변화해서 반환
    • String toUpperCase()
      • 문자열을 전부 대문자로 변환해서 반환

 

StringTokenizer 클래스

  • 직접 지정한 구분자로 문자열을 토큰으로 분리해주는 클래스
  • 구분자의 default값은 공백문자
  • import java.util.StringTokenizer
  • 선언 및 초기화
StringTokenizer toekn = new StringTokenizer(문자열);
  • 메소드
    • int countTokens()
      • 현재 남아있는 token의 개수 반환
    • boolean hasMoreElements()
      • 다음에 남아있는 token이 하나 이상이면 true 반환, 없으면 false 반환
    • boolean hasMoreTokens()
      • hasMoreElements()와 기능을 동일
    • Object nextElement()
      • 다음 토큰을 Object 형식으로 반환
    • String nextToken()
      • 다음 토큰을 String 형식으로 반환

 

StringBuilder 클래스

  • 여러 개의 문자열을 더할 때 새로운 인스턴스 생성 없이 할 수 있는 클래스
  • StringBuilder 객체 생성 후 append() 메소드에 연결하고자 하는 문자열, 정수를 인자로 넣어서 연속적으로 문자열 연결 가능
  • String 객체로 변환하려면 toString() 메소드를 이용해서 StringBuilder형에서 String형으로 변환
  • 사용 예시
StringBuilder builder = new StringBuilder(); //초기화 및 선언
builder.append("hello").append(1);
String s = builder.toString(); // s = "hello1"

 

StringBuffer 클래스

  • 인스턴스의 값의 수정이 가능한 클래스
  • String 클래스는 + 연산자로 문자열을 연결하면 새로운 인스턴스 생성으로 속도가 느려지지만 StringBuffer는 내부적인 버퍼(buffer)를 이용해서 공간 낭비가 없고 속도가 빠름
  • 기본적인 버퍼 사이즈 : 16, 직접 설정 가능(인스턴스를 생성할 때 인자의 길이만큼 버퍼의 크기가 늘어남)
  • 선언 및 초기화
StringBuffer buffer = new StringBuffer(문자열);
  •  메서드
    • String append()
      • 인자를 문자열 뒤에 추가 후 저장
    • int capacity()
      • 현재 버퍼 사이즈 출력
    • String delete(int num1, int num2)
      • 인덱스 num1 ~ num2-1에 있는 문자열 삭제 후 저장
    • String deleteCharAt(int num)
      • 인덱스 num에 있는 문자만 삭제 후 저장
    • String insert(int num, String str)
      • 인덱스 num-1과 num 사이에 str를 추가한 후 저장

 

연산자(Operator)

  • 산술 연산자
    • + : 덧셈 연산자
    • - : 뺄셈 연산자
    • * : 곱셈 연산자
    • / : 나눗셈 연산자
    • % : 나머지 연산자
  • 증감 연산자
    • ++ : 1씩 증가시키는 연산자
    • -- : 1씩 감소시키는 연산자
    • 전위형 증감연산자 : 1을 증가시킨 후 다른 코드 진행
    • 후휘형 증감연산자 : 먼저 다른 코드 실행 후 1을 증가시킴
  • 복합 대입 연산자
    • 자기 자신에 대한 연산을 할 때 사용하는 연산자로 산술연산자와 = 연산자를 같이 사용
    • +=
    • -=
    • *=
    • /=
    • %=
    • ex) A += 10; → A + 10 = A;
  • 비교연산자
    • boolena형을 반환
    • 대소 비교연산자 : 성립하면 true, 성립하지 않으면 false
      • >
      • <
      • >=
      • <=
    • 등가 비교 연산자
      • == : 양쪽항이 같으면 true, 틀리면 false
      • != : 양쪽항이 다르면 true, 같으면 false
  • 논리 연산자
    • AND 연산자(&&) : 두 개의 피연산자가 모두 true일 때만 true를 반환하고, 나머지 경우는 false 반환
    • OR 연산자(||) : 두 개의 피연산자가 모두 false일 때만 false를 반환하고, 나머지 경우는 true 반환
  • 연산자 우선순위
    1. (), []
    2. 부정 연산자(!, ~), 증감 연산자(++, --)
    3. 곱셈 연산자(*), 나눗셈 연산자(/), 나머지 연산자(%)
    4. 대소 비교 연산자(<. >, <=, >=)
    5. AND 연산자(&&)
    6. OR 연산자(||)
    7. 조건 연산자(?:)
    8. 대입 연산자(=), 복합 대입 연산자(+=, -=, /=, %=)

 

입출력

  • 입력
import java.util.Scanner; // 입력 Scanner 클래스 선언

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in); // Scanner 객체 선언
        String str = scanner.nextLine(); // 문자열 입력
        int num = scanner.nextInt(); // 정수 입력
        float f = scanner.nextFloat(); // 실수 입력
    }
}
  • 출력
public class Main {
    public static void main(String[] args) {
        int num = 10;
        System.out.println("줄 바꿈 출력");
        System.out.print("줄 바꿈 없이 출력\n");
        System.out.printf("지시자 이용 %d", num);
    }
}

 

🧶 발생한 문제 및 해결방법

  • 문제점) String.format 이란?
  • 해결방법) 문자열을 출력할 때, 지시자를 사용하는 방법
String.format("안녕 만나서 반가워 %d", number);

 

  • 문제점) int → char과 char → int 변환 방법은?
  • 해결방법) char이 유니코드를 이용한다는 성질을 이용
  • int → char
    • 4byte에서 2byte로 변환되므로 수동형변환 필요
int num = 9;
char ch = (char)(num + '0');
  • char → int
    • 2byte에서 4byte로 변환되므로 자동형변환이 일어남
char ch = '9';
int num = ch - '0';

 

 공부 난이도

Java 변수&문자열 ☆☆☆☆★

 

🌕 느낀점

  오랜만에 자바를 공부해서 복습하는 기분이었다. 기본적인 틀은 그대로인 상태에서 어떤 상황에 어떤 메서드를 사용해야 하는지 알게 되었다. 그리고 char의 정수값과 문자값을 이용해서 어떻게 변경하는지 약간 복잡하기는 했는데 익히고 나니까 유용하게 사용할 수 있을거라는 생각이 들었다.