본문 바로가기
부트캠프 개발일기/Java

5일차: Java 기초(변수, 타입, 문자열)

by shyun00 2023. 2. 17.

Java 특징

Java: 1996년에 세상에 나온 객체지향 프로프래밍(Object Oriented Programming, OOP)언어

  • 운영체제에 독립적: JRE가 설치된 모든 운영체제에서 실행 가능함
  • 객체 지향 언어: 모든 기능을 객체(프로그램 동작을 위한 부품 개념)로 만들어 사용.여러 객체를 만들고 조립해서 프로그램을 실행
  • 함수형 프로그래밍 지원: 자바 8버전부터 함수형 프로그래밍 지원하는 문법인 람다식과 스트림이 추가됨(추후 학습 예정)
  • 자동 메모리 관리: 가비지 컬렉터(Garbage Collector)를 실행시켜 자동으로 사용하지 않는 메모리 수거함

JVM과 JDK

  • JVM: Java Virtual Machine 
  • 자바는 컴파일러(javac)를 통해 기계어로 변환되는 언어임. JVM은 컴파일된 바이트코드를 각 운영체제에 맞는 기계어로 변환해줌으로써 운영체제에 관계없이 실행 가능하도록함. JDK나 JRE를 설치하면 자동으로 설치됨
  • JRE(Java Runtime Environment): JVM + 표준 클래스 라이브러리
  • JDK(Java Development Kit): JRE + 개발에 필요한 도구

JDK 8 vs 11 vs 17

JDK에는 여러가지 버전이 존재함. STS, MTS, LTS는 각 버전에 대한 관리 및 지원이 얼마나 오래 제공되는지를 나타내며, 보통 LTS를 사용함. 또한 해당 개발도구가 얼마나 오랫동안 많은 사람들에게 사용되어 왔는지도 버전 선택 시 유의사항임.

--> 학습용으로 11버전 활용 예정(사용자가 가장 많은것은 8버전)

IntelliJ

JetBrains 사에서 개발한 IDE. 학습용으로 사용 예정

메서드

어떤 기능을 수행하기 위한 코드들을 묶어놓은것.

A 메서드이름 (B C) {D} 형태를 가짐.

A: 반환타입. 메서드가 변환할 값의 종류 및 유형

B: 매개변수 타입 --> 메서드 외부에서 내부로 전달되어진 값을 저장한 변수. 어떤 유형을 받아서 어떤 이름으로 사용할지 나타냄

C: 매개변수 이름

D: 메서드 바디: 구체적으로 어떤 기능을 수행할지 작성하는 부분. 

❯ 변수와 타입

컴퓨터의 기억과정은 [기억에 필요한 메모리 공간 파악 -> 필요한 만큼 메모리 확보 -> 공간에 이름 붙임 -> 값 저장] 순서임

변수(Variable)

값이 변할수 있는 데이터를 임시적으로 저장하기 위한 수단

컴퓨터 RAM이 메모리에 해당하며, 1byte의 메모리셀이 모여서 형성되며 각 메모리셀별로 고유번호(메모리주소)를 가짐

프로그래밍에서 메모리 주소를 바로 사용할 경우 식별이 어렵고 실수 확률도 늘어나므로 변수를 선언, 사용하게됨

  • 변수선언: type + 이름    ex. int num;
  • 값 할당: 대입 연산자 =를 사용    ex. num = 25;   --> 변수 선언 후 처음 값을 할당하는것을 '초기화'라고함.
  • 선언과 할당을 동시에 할 수 있음    ex. int num = 25;
  • 변수 명명 규칙: camelCase법을 사용하여 두번째 단어부터 대문자를 사용

상수(Constant)

변하지 말아야하는 데이터를 저장하는 수단. 재할당이 금지된 변수

  • final 키워드를 사용하여 선언함    ex. final double CALCULATOR_PI = 3.14;
  • 변수 명명 시 관례적으로 _ 로 단어를 구분하는 SCREAMING_SNAKE_CASE를 사용함

타입(Type)

값의 유형 및 종류를 의미함. 타입에 따라 메모리 공간의 크기와 값 저장 방식이 결정됨

  • 기본타입(primitive type): 데이터 실제 값을 저장함
                                              정수(byte, short, int, long), 실수(float, double), 문자(char), 논리(boolean)타입 해당
  • 참조타입(reference type): 데이터가 저장된 주소값을 저장함
                                              기본타입 8가지를 제외한 모든타입에 해당

리터럴(Literal): 문자가 가리키는 값 그 자체를 의미함. ('값'이라는 표현보다 리터럴이라는 표현이 더 적합) 변수 또는 상수에 할당가능

타입의 종류와 특징

  • 정수타입: byte(1), short(2), int(4), long(8)으로 구분되며 각각 차지하는 메모리 크기와 표현가능 범위가 다름
  • 실수타입: float(4), double(8)로 구분되며 소수점을 가지는 값. float 할당 시 접미사 f 를 사용함
  • 논리타입: boolean(1) 참 또는 거짓을 값으로 가짐
  • 문자타입: char(2) 하나의 문자형 리터럴을 가지며, ''를 사용해 할당함. 유니코드(각 문자에 숫자 코드번호 부여한것)로 문자를 저장함
    * (  )안의 숫자는 각 타입이 차지하는 메모리 크기 byte를 나타냄

타입 변환

boolean을 제외한 7개 기본타입은 타입간 변환이 가능함

  • 자동 타입 변환: 바이트 크기가 작은 타입에서 큰 타입으로, 덜 정밀한 타입에서 더 정밀한 타입으로 변환할 때 자동으로 변환됨
  • 수동 타입 변환: 차지하는 용량이 큰곳에서 작은곳으로 갈때는 자동 변환이 되지 않음.
                            수동으로 바꾸는것을 캐스팅(Casting)이라고 하며, 캐스팅 연산자  (  )를 사용함

❯ 문자열(String)

자바는 String 클래스 타입을 사용해서 문자열을 다룸. 클래스는 그 자체로 타입으로 사용가능하며 연관 기능을 묶을 수 있음

--> 추후 추가 학습 예정

String 타입의 변수 선언과 할당

선언 방식은 기본타입들과 유사하며 char과 달리 "" 를 사용해 할당함    ex. String name = "hyun";

String은 참조타입의 변수이므로 String 클래스의 메서드인 toString()이 자동으로 호출되며, toString()이 호출되면 변수가 저장한 주소값에 위치한 String 인스턴스 내용을 문자로 변환

String 클래스의 메서드

String 클래스에는 문자열을 조작할 수 있는 메서드가 존재함

  • charAt(인덱스넘버): 해당 문자열의 특정 인덱스에 해당하는 문자를 반환함
  • compareTo(인수): 해당 문자열과 인수로 전달된 문자열을 비교하여 사전순으로 비교. 두 문자열이 같다면 0, 해당 문자열이 인수보다 작으면 음수, 크면 양수를 반환함. (유니코드 참고)
  • concat(인수): 해당 문자열 뒤에 인수로 전달된 문자열을 추가해서 반환함 (concatenate)
  • indexOf(인수): 해당 문자열에서 인수내용이 처음 등장하는 인덱스 위치를 반환. 없을 경우 -1 반환
  • trim(): 해당 문자열의 맨앞과 맨뒤의 모든 공백 제거
  • toLowerCase(), toUpperCase(): 해당 문자열 모든 문자를 소문자 / 대문자로 변경

StringTokenizer

문자열을 우리가 지정한 구분자로 쪼개는 클래스. 쪼개진 문자열을 Token이라고 함

Import* java.util.StringTokenizer; 후 사용함

* 자바 라이브러리 패키지 혹은 다른 패키지의 클래스를 사용하려면 사용 전 import 필요

[자주 사용하는 메서드]

  • countTokens(): 남아있는 토큰 갯수 반환
  • hasMoreElements(), hasMoreTokens(): 현재 위치 뒤의 문자열에 하나 이상의 토큰이 있으면 true, 아니면 false
  • nextElement(), nextToken(): 현재 위치 다음의 토큰을 반환함
    * 위 두 메서드에서 element와 token의 차이는, element는 Object를, token은 String을 반환함

StringBuilder

한번 생성된 String클래스의 인스턴스는 여러개 문자열을 더할 때 매번 새로운 인스턴스를 생성함

String에 문자열을 더할 때 새로운 객체를 생성하는 것이 아니라 기존 데이터에 더하는 방식을 사용할 수 있음

.append("추가할 내용") 형태로 사용하며 인스턴스를 다시 문자로 출력할때는 toString() 을 사용함

StringBuffer

String 클래스의 인스턴스는 한번 생성되면 변경이 불가능한데, StringBuffer 클래스의 인스턴스는 값 변경 및 추가가 가능함

내부적으로 Buffer라는 독립적 공간을 가지며 16개 문자를 저장할 수 있는 (추가)크기를 가짐

[자주 사용하는 메서드]

  • append("인수"): 인수로 전달된 값을 문자열로 변환한 뒤 해당 문자열 마지막에 추가
  • capacity(): StringBuffer 인스턴스의 현재 버퍼 크기를 확인
  • delete(A, B): 인덱스가 A인덱스부터 B인덱스 앞의 문자까지 삭제
  • deleteCharAt(A): 인덱스가 A인 위치의 문자 한개만 삭제
  • insert(A, "B"): 인덱스가 A인 곳에 B 문자열 추가 

확실히 조금씩 학습해야하는 내용이 많아지는것이 느껴진다.

페어님과 함께 연습문제를 풀때 강의 자료에 없는 내용들도 꽤 확인할 수 있었다.

아무래도 둘이서 같이 문제를 풀어가다보니 혼자 찾아보는것보다도 더 여러가지 방법으로 고민할 수 있어서 좋았다.

구글링을 통해 모든 문제를 풀수는 있었는데, 정확한 자료를 빠르게 찾아내는것도 중요한 역량 중 하나라는 생각이 들었다.

 

+ 추가

어제 페어 프로그램을 하면서 출제 의도와 다른 방법을 사용해 어떻게든 답만 맞추게 된 문제들이 있었다.

아무래도 계속 마음에 걸려서 다시 구글링 하면서 방법을 찾아봤는데, 출제 의도에 맞는 코드들을 찾을 수 있었다!

아직 교육 초반이라 많이 어려운 부분은 아니지만, 이렇게 하나하나 다시 찾아보면서 배우는게 개발 공부의 재미인것같다.

앞으로도 이렇게 계속 고민하고 찾아보는 태도를 유지할 수 있기를 다짐해본다.