❯ 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 문자열 추가
확실히 조금씩 학습해야하는 내용이 많아지는것이 느껴진다.
페어님과 함께 연습문제를 풀때 강의 자료에 없는 내용들도 꽤 확인할 수 있었다.
아무래도 둘이서 같이 문제를 풀어가다보니 혼자 찾아보는것보다도 더 여러가지 방법으로 고민할 수 있어서 좋았다.
구글링을 통해 모든 문제를 풀수는 있었는데, 정확한 자료를 빠르게 찾아내는것도 중요한 역량 중 하나라는 생각이 들었다.
+ 추가
어제 페어 프로그램을 하면서 출제 의도와 다른 방법을 사용해 어떻게든 답만 맞추게 된 문제들이 있었다.
아무래도 계속 마음에 걸려서 다시 구글링 하면서 방법을 찾아봤는데, 출제 의도에 맞는 코드들을 찾을 수 있었다!
아직 교육 초반이라 많이 어려운 부분은 아니지만, 이렇게 하나하나 다시 찾아보면서 배우는게 개발 공부의 재미인것같다.
앞으로도 이렇게 계속 고민하고 찾아보는 태도를 유지할 수 있기를 다짐해본다.
'부트캠프 개발일기 > Java' 카테고리의 다른 글
10일차: 객체지향 프로그래밍 기초(생성자, 내부클래스) (0) | 2023.02.24 |
---|---|
9일차: 객체지향 프로그래밍 기초(Class, Field, Method) (0) | 2023.02.23 |
8일차: Java 기초(배열) (0) | 2023.02.22 |
7일차: Java 기초(반복문/for, while, do-while) (0) | 2023.02.21 |
6일차: Java 기초(연산자, 콘솔I/O, 조건문/if, switch) (0) | 2023.02.20 |