Java의 기본적인 코드의 형태와 Java의 기본 자료형이 어떤 것들이 있으며, 사용법과 주의할 점 등을 적어보았다.
cf) 이글은 2023년 3월 28일에 진행됐던 sscc 자바 스터디 2주차 스터디 내용을 정리한 글입니다.
모든 프로그래머가 처음 언어를 배울 때 마주하는 Hello World 예제를 통해 자바의 기본 구조를 살펴보자.
public class HelloWorld {
public static void main(String[] args){
System.out.println("Hello World!");
}
}
(접근 제어자) class (클래스 이름){
(접근 제어자) [static] (반환형) (함수이름) (매개변수){
(명령문);
}
}
접근 제어자니 클래스 이름이니 지금은 배우지 않은 내용이므로 자세히 볼 필요는 없다. 어차피 나중 가면 다 배운다.
정말 무슨 소리인지 하나도 모르겠다면 이것만 외우자.
자바에서 클래스명은 대문자로 시작한다. 그 외에 함수나 변수는 모두 소문자로 시작한다.
이걸로 해당 인자가 함수인지 클래스인지 알 수 있다.
(ex, String은 primitive 타입이 아니라 reference 타입이다. 대문자로 시작 == 클래스)
primitive 타입 - 언어에서 미리 지정된 자료형
TMI) CamelCase란? - 각 단어의 시작부분을 대문자로 작성하여 음절을 표기하는 방법.
그 모양새가 꼭 낙타 등의 혹 같다고 하여 붙여진 별명이다.
기본적으로 다른 언어와 비슷하다.
자바에서는 8개의 primitive 타입이 존재한다. 이 외에 모든 것은 전부 reference 타입이므로 8개만 외우자.
정수 : byte, short, int, long
실수 : float, double
참/거짓 : boolean
문자 : char
각 항목을 자세히 살펴보자.
정수, 실수
자바에선 형 지정을 따로 안 할 경우 디폴트로 정수는 int, 실수는 double이 지정된다. 따라서, 디폴트 이외의 것을 사용하려면 별도의 처리가 필요하다. (int 범위가 넘어가면 'L'을 적는다거나, float 사용시 'F'를 적는다는지 등등.)
8진수, 16진수
또한, C/C++ 처럼 8진수, 16진수 표현을 할 때, 숫자 앞에 각각 0, 0x를 붙여 표현한다. 물론 이 친구들도 별도의 자료형이 존재하는 것이 아니라, 8개의 자료형 중 하나로 표현되어야 한다.
따라서, 8진수와 16진수는 int 자료형을 사용한다.
boolean
C/C++의 _Bool 형과 같다. true, false로 표현하는데,
여기서 주의해야 할 점은 C언어처럼 true == 1, false == 0 으로 간주하여 사용하면 안 된다.
자바는 오직 boolean 타입을 true나 false로 적어야 한다 (안 그럼 컴파일 에러남).
while(1) 이런 거 안 된다는 얘기다. 헷갈리지 말자.
문자열 : String, StringBuffer(요건 나중에 배움!)
배열 : List, Map, Set
위에도 서술했지만, String은 클래스이므로 첫 글자를 대문자임을 주의하자.
파이썬의 기본 문자열 메소드와 기능적으로 유사하다.
.equals() - 같으면 true, 다르면 false 리턴
.indexOf() - 특정 문자의 '시작' 위치를 리턴
.contains() - 특정 문자열을 포함하면 true, 없으면 false 리턴
.charAt() - 특정 문자(char) 인덱스 리턴
.split() - 문자열을 나누어서 배열로 저장
String str = new String();
char c;
str = "안녕하세요";
c = str.charAt(0);
System.out.print(c);
이 코드를 수행하게 되면 str에 저장되어 있는 "안녕하세요" 에서
0번째 인덱스인 '안'이 화면에 출력된다.
나는 아직 charAt() 밖에 사용해보지 못해서 각 메소드의 자세한 사용 방법은 서술하지 않겠다.
배열의 크기는 고정되어 있다.
사용법이 2가지인데, 사용 예재를 보며 학습해보자.
int[] odds = {1, 3, 5, 7, 9}; //1번 케이스
String[] pokemons; //2번 케이스
pokemons = new String[7];
1번의 경우, C언어에서의 배열 선언 방법과 똑같다. (대괄호 위치만 조금 바뀐 것 뿐)
2번의 경우, C에서는 상상할 수 없는 선언 방식이다. 문자열 배열을 만들었는데, 초기화도 안 한 주제에 배열의 크기를 지정하지 않았다. 그리고 후에 new 연산자를 이용하여 배열을 할당했다.
이는, 자바의 클래스 특성에 의한 것이다.
유의할 점. 심화 자료형의 메소드를 외우려 하지 마라.
이런 게 있다는 걸 알아만 두고 검색해서 쓸 수 있으면 충분.
리스트는 배열과 매우 유사하지만, 여러 방면에서 편리한 기능을 제공한다.
배열과 리스트의 가장 큰 차이점은 리스트는 크기가 고정되어 있지 않다.
import java. util.ArrayList;
add, get, size 등의 편리한 메소드가 존재한다.
입력 값을 리스트에 삽입하는 메소드다.
1. pitches.add("138"); //pitches 객체 맨 뒤 인덱스에 "138" 추가
2. pitches.add(0, "133"); //첫 번째 위치에 "133" 삽입
리스트에 저장된 값을 추출하는 메소드다.
System.out.println(pitches.get(1)); //pitches 객체의 2반째 값을 출력한다.
ArrayList에 저장된 원소의 갯수를 리턴한다.
System.out.println(pitches.size()); //pitches 객체에 담긴 갯수 출력
contains 메소드는 리스트 안에 해당 항목이 있는지를 판별하여 그 결과를 boolean으로 리턴한다.
System.out.println(pitches.contains("142")); //pitches 객체가 "142"를 원소로 갖는다면 true가 출력
remove 메소드에는 2가지 방식이 있다. (이름은 같지만 입력파라미터가 다르다)
첫번째 remove(객체)의 경우는 리스트에서 객체에 해당되는 항목을 삭제하고 삭제한 결과(true, false)를 리턴한다.
System.out.println(pitches.remove("129"));
true
"129"라는 항목이 성공적으로 삭제되고 true를 리턴한다.
두 번째 remove(인덱스)의 경우는 해당 인덱스의 항목을 삭제하고 삭제된 항목을 리턴한다.
System.out.println(pitches.remove(0));
138
pitches의 첫번째 항목은 "138"이므로 "138"이 삭제된 후 "138"을 리턴한다.
ArarayList 안에 담을 수 있는 자료형을 한정시키는 기법이다.
제네릭스를 이용하면 좀 더 명확한 타입체크가 가능해진다.
ArrayList<String> pitches = new ArrayList<>(); // 선호되는 방식
제네릭스를 사용하지 않으면 리스트에 여러 가지 자료형의 원소들이 들어갈 수 있고, 이는 나중에 리스트를 다룰 때 형 변환 과정에서 잘못된 형변환으로 인한 오류가 발생할 가능성이 있다.
따라서, 특별한 목적이 있는 것이 아니라면 제네릭스를 사용할 수 있을 때 사용하는 것이 좋다.
배열처럼 인덱스를 사용하는 것이 아닌 Key 값을 사용한다.
import java.util.Hashmap;
사전(딕셔너리)과 같은 방식으로 값을 저장하는 자료형이다.
ex)
import java.util.HashMap;
public class Sample {
public static void main(String[] args) {
HashMap<String, Integer> map = new HashMap<>();
map.put("컴퓨터학부", 140);
map.put("소프트웨어학부", 100);
}
}
수학에서의 집합을 떠올리자. 중복을 알아서 걸러준다.
import java.util.HashSet;
순서가 없고 중복도 발생하지 않는 자료형이다.
add, get, size 등의 편리한 메소드를 제공한다.