코드스테이츠 5일차
자바의 특징
1. 운영체제에 독립적
자바 이전의 언어들은 특정 CPU에서만 작동하거나 특정 OS에 따라 다르게 작성해야 하는(C, C++) 언어들이 대부분이었다. 자바는 이 문제를 해결하고자 JRE(Java Runtime Environment: JVM(자바 가상머신) + 표준 클래스 라이브러리)가 설치되어 있는 모든 운영체제에서 실행이 가능하도록 만들어졌다.
2. 객체 지향 언어(Object Oriented Programming, OOP)
자바는 객체 지향 프로그래밍 개념을 사용하는 언어입니다. 따라서 모든 기능은 객체로 만들어 사용해야 합니다. 객체는 프로그램이 동작하는 부품이라고 생각하면 된다.
3. 함수형 프로그래밍 지원
자바 8버전부터 함수형 프로그래밍을 지원하는 문법인 람다식과 스트림이 추가되었습니다. 이를 사용하면 컬렉션의 요소를 필터링, 매핑, 집계 처리하기 쉬워지고 코드가 간결해지는 장점이 있다.
4. 자동 메모리 관리(Garbage Collection)
자바는 96년에 발표된 언어이고 C++를 개선하는 것 또한 여러 목표 중의 하나였다. 그래서 자바는 자동으로 메모리를 관리해 주는 기능을 추가했다. C, C++의 경우 메모리의 생성과 소멸을 개발자가 직접 설계해야 했지만, 자바는 가비지 컬렉터(Garbage Collector)를 실행시켜 자동으로 사용하지 않는 메모리를 수거한다.
메서드
메서드란?
'어떤기능을 수행하기 위한 코드들을 묶어놓은 것'이며, 여기에서 '어떤 기능을 수행한다'는 것은 데이터를 입력받아 입력받은 데이터에 일련의 처리를 가한 후, 그결과값을 반환하는 것을 의미한다.
메서드는 아래와 같은 형태로 정의할 수 있다.
1 A main(B C) {
2 D
3 }
각 A, B, C 요소는 아래와 같다.
1 반환_타입 메서드_이름(매개변수_타입 매개변수_이름) {
2 메서드_바디
3 }
A는 반환 타입을 의미한다.
B = 매개변수의 타입, C = 매개변수의 이름을 의미한다.
D = 메서드 바디를 의미한다.
변수
값이 변할 수 있는 데이터를 임시로 저장하기 위한 수단이다.
변수 선언
어떤 값을 저장할 메모리 공간을 확보하고, 해당 메모리 공간을 식별할 수 있는 이름을 붙이는 것
(타입type) (변수명) 순으로 선언한다. ex) int num1 / double num2 / char name
값 할당
선언한 변수에 값을 넣는 과정
선언한 변수에 대입 연산자 "="를 활용하여 값을 넣는다. ex) num1 = 1; / num2 = 2; / char name = "hello";
변수 선언과 동시에 초기화도 가능하다. ex) int num1 = 1; / double num2 = 2; / char name = "hello";
변수 명명 규칙
변수 이름을 지을 때 지켜야 하는 룰이 있다.
- 숫자로 시작하는 변수명은 사용할 수 없다. ex) int 1num (x)
- 변수명으로 영문자 / 숫자 / _ / $ 를 사용할 수 있으며, 영어는 대소문자가 구별되어 인식된다. ex) int A_$num1 (o)
- 자바에서 이미 사용중인 예약어는 변수명으로 사용할 수 없다. ex) int byte / int class (x)
- 공백 사용이 불가능 하다. ex) int num ber1 (x)
상수(Constant)
변하지 말아야 할 데이터를 임시로 저장하기 위한 수단
final 이라는 키워드를 사용해 선언할 수 있다. ex) final double num1 = 3.14;
상수를 사용하는 이유
1. 프로그램이 실행되면서 값이 변하면 안 되는 경우
프로그래머가 실수로 상수에 값을 재할당하고자 하면 에러가 발생하여 실수를 방지할 수 있다.
2. 코드 가독성을 높이고 싶은 경우
상수를 사용하면 값을 저장하고 있는 상수 명으로 값을 사용할 수 있기 때문에 코드 가독성이 향상된다.
3. 코드 유지관리를 손쉽게 하고자 하는 경우
계산기 프로그램을 만들었으며, 소스 코드에서 원주율이 필요한 곳에 모두 숫자 값 3.14를 그대로 사용했다고 가정한다. 만약, 계산의 정밀도를 높이기 위해 원주율을 3.14159로 변경해야 한다면, 기존의 3.14가 사용된 모든 코드를 찾아 일일이 수정해주어야 한다. 반면, 상수를 사용하면 상수에 할당할 값만 3.14159로 바꾸어주면 된다.
타입(type)
타입은 어떤 값의 유형 및 종류를 의미하며, 타입에 따라 값이 차지하는 메모리 공간의 크기와, 값이 저장되는 방식이 결정된다.
기본 타입(primitive type)
- 값을 저장할 때, 데이터의 실제 값이 저장된다.
- 정수 타입(byte, short, int, long), 실수 타입(float, double), 문자 타입(char), 논리 타입(boolean)
참조 타입(reference type)
- 값을 저장할 때, 데이터가 저장된 곳을 나타내는 주소값이 저장된다.
- 객체의 주소를 저장, 8개의 기본형을 제외한 나머지 타입
리터럴
리터럴이란 문자가 가리키는 값 그 자체를 의미
ex) int num1 = 10 ;
정수형 리터럴 10을 정수형 변수 num1에 할당
이 부분에서 10이 리터럴이 된다.
정수 타입
숫자를 나타내는 타입 byte, short, int, long 총 4개의 타입으로 분류된다. 일반적으로 int 형이 사용된다.
byte | 1byte | -128(-27) ~ 127(27 - 1) |
short | 2byte | -32,768(-215) ~ 32,767(215 - 1) |
int | 4byte | -2,147,483,648(-231) ~ 2,147,483,647(231 - 1) |
long | 8byte | -9,223,372,036,854,775,808(-263) ~ 9,223,372,036,854,775,807(263 - 1) |
실수 타입
실수는 소수점을 가지는 값을 의미한다. float형과 double형으로 분류된다.
float | 4byte | 음수 : -3.4 * 1038 ~ -1.4 * 10-45 양수 : 1.4 * 10-45 ~ 3.4 * 1038 |
7자리 |
double | 8byte | 음수 : -1.8 * 10308 ~ -4.9 * 10-324 양수 : 4.9 * 10-324 ~ 1.8 * 10308 |
15자리 |
논리 타입
논리타입의 종류는 boolean형 한 가지 뿐이다. boolean형은 참 또는 거짓을 저장할 수 있는 데이터 타입으로, 오직 true 혹은 false를 값으로 가진다.
boolean isHuman = true;
boolean noHuman= false;
문자 타입
문자 타입은 2byte 크기의 char형 한 가지 뿐이다.
문자 타입 변수를 선언하면 해당 변수에 오직 하나의 문자형 리터럴을 저장할 수있다.
문자형 리터럴을 작성 할 때는 반드시 큰 따옴표("")가 아닌 작은 따옴표('')를 사용해야한다.
char letter1 = 'a';
char letter2 = 'ab'; // 에러 : 단 하나의 문자만 할당할 수 있습니다.
char letter3 = "a" // 에러 : 작은 따옴표를 사용해야 합니다.
타입 변환
boolean을 제외한 기본타입 7개 서로 타입변환가능
자동 타입변환
타입이 자동으로 변환되는 경우
- 바이트 크기가 작은 타입에서 큰타입으로 변환시(ex: byte→ int)
- 덜 정밀한 타입에서 더 정밀한 타입으로 변환시 (ex: 정수 → 실수)
byte(1) -> short(2)/char(2) -> int(4) -> long(8) -> float(4) -> double(8)
- 좌측의 타입이 우측의 타입으로 자동 변환 가능
- float는 4바이트인데 int, long보다 뒤쪽
- float가 표현할 수 있는 값이 모든 정수형보다 더 정밀하기 때문
- // float이 long보다 정밀하므로, 자동으로 타입이 변환됩니다. long longValue = 12345L; float floatValue = longValue; System.out.println(floatValue); // 12345.0이 출력됩니다.
수동타입변환
- 메모리 용량이 더 큰 타입에서 작은 타입으로 자동타입변환안됨.
캐스팅(casting)
- 더 큰 데이터 타입을 작은 데이터 타입의변수에 저장하기 위해 수동으로 타입변환
- 수동으로 타입 변환시 캐스팅연산자 () 사용
- 캐스팅 연산자 괄호안에 변환하고자하는 타입 적기
//int 타입으로 선언된 변수 intValue를 더 작은 단위인 byte로 변환합니다. int intValue = 128; byte byteValue = (byte)intValue; System.out.println(byteValue); // -128
- intvalue가 저장하고 있는 inbt형값 128을byte형으로 캐스팅. byte형 변수 byteValue에할당
- byte형 표현범위는 -128 ~ 127. ⇒ 오버플로우 발생
- 최종 저장값 -128
- 메모리 용량이 넉넉해진 지금은 일반적으로 정수는 int, long, 실수는 double사용
⇒ 수동타입 변환의 사용빈도 많이 줄음
좀더 알아보면 좋은 키워드
- java int to string
- 숫자를 문자열로 변환
- Integer.toString(), String.vcalueOf()메서드 이용
- 간단하게 빈문자여과 int를 +연산자로 연결하여 문자열 변환 가능
- String str= Integer.toString(intValue);
- String str = String.valueOf(intValue);
- String str = intValue + “”;
- 문자열에 int를 이어붙이면 문자열이 리턴되는 속성 이용
- java string to int
- 문자열을 숫자로 변환
- java.lang.Integer클래스의 parseInt(), valueOf()메소드 사용
- Integer.parsesInt()
- static int parseInt(String s)
- java.lang.Integer클래스의 static메소드
- 파라미터로 숫자로 변환할 문자열 입력
- 입력받은 문자열을 integer로 변환한 primitive type인 int값 리턴
- int intValue = Interger.parserInt(string);
문자열(String)
String 타입의 변수 선언과 할당
기본적으로 String 타입은 큰따옴표("")로 감싸진 문자열을 의미한다.
String 타입의 변수를 선언하고, 문자열 리터럴을 할당하는 방법은 다음과 같습니다.
// 1.문자열 리터럴을 String 타입의 변수 name에 할당하는 방법
String name1 = "Kim Coding";
// 2.String 클래스의 인스턴스를 생성하는 방법
String name2 = new String("Kim Coding");
String 클래스의 메서드
1. charAt() 메서드
- 해당 문자열의 특정 인덱스에 해당하는 문자를 반환
- if 해당 문자열의 길이보다 큰 인덱스나 음수를 전달시 오류 발생
String str = new String("Java");
System.out.println("문자열 : " + str); // "문자열 : Java"
System.out.println(str.charAt(0)); // 'J'
System.out.println(str.charAt(1)); // 'a'
System.out.println(str.charAt(2)); // 'v'
System.out.println(str.charAt(3)); // 'a'
System.out.println("\ncharAt() 메서드 호출 후 문자열 : " + str);
2. compareTo()메서드
- 해당 문자열을 인수로 전달된 문자열과 사전 편찬 순으로 비교
- 문자열을 비교시 대소문자를 구분하여 비교
- 만약 두 문자열이 같다면 0을 반환. 해당 문자열이 인수로 전달된 문자열보다 작으면 음수, 크면 양수 반환
- 만약 문자열을 비교시 대소문자를 구분하지 않기를 원한다면, compareToIgnoreCase()
메서드 사용
String str = new String("abcd");
System.out.println("문자열 : " + str);
System.out.println(str.compareTo("bcef"));
System.out.println(str.compareTo("abcd") + "\n");
System.out.println(str.compareTo("Abcd"));
System.out.println(str.compareToIgnoreCase("Abcd"));
System.out.println("compareTo() 메서드 호출 후 문자열 : " + str);
3. concat() 메서드
- 해당 문자열의 뒤에 인수로 전달된 문자열을 추가한 새로운 문자열을 반환
- concatenate의 약자 사전적으로 연결
- 만약 인수로 전달된 문자열의 길이가 0이면, 해당 문자열을 그대로 반환
String str = new String("Java");
System.out.println("문자열 : " + str);
System.out.println(str.concat("수업"));
System.out.println("concat() 메서드 호출 후 문자열 : " + str);
4. indexOf()메서드
- 해당 문자열에서 특정 문자나 문자열이 처음으로 등장하는 위치의 인덱스 반환
- 만약 해당 문자열에 전달된 문자나 문자열이 포함되어 있지 않으면 -1 반환
String str = new String("Oracle Java");
System.out.println("문자열 : " + str);
System.out.println(str.indexOf('o'));
System.out.println(str.indexOf('a'));
System.out.println(str.indexOf("Java"));
System.out.println("indexOf() 메서드 호출 후 원본 문자열 : " + str);
5. trim()메서드
- 해당 문자열의 맨 앞과 맨 뒤에 포함된 모든 공백 문자 제거
String str = new String(" Java ");
System.out.println("문자열 : " + str);
System.out.println(str + '|');
System.out.println(str.trim() + '|');
System.out.println("trim() 메서드 호출 후 문자열 : " + str);
6. toLowerCase(), toUpperCase()메서드
- toLowerCase()메서드: 해당 문자열의 모든 문자를 소문자로 변환
- toUpperCase() 메서드: 해당 문자열의 모든 문자를 대문자로 변환
String str = new String("Java");
System.out.println("문자열 : " + str);
System.out.println(str.toLowerCase());
System.out.println(str.toUpperCase());
System.out.println("두 메서드 호출 후 문자열 : " + str);
'코드 스테이츠' 카테고리의 다른 글
코드 스테이츠 4/19 - Java 기초 3 (0) | 2023.04.19 |
---|---|
코드 스테이츠 4/18 - Java 기초 2 (0) | 2023.04.18 |
코드 스테이츠 4/14 - Git (0) | 2023.04.14 |
코드 스테이츠 4/13 - CLI (리눅스, Ubuntu) (0) | 2023.04.13 |
코드 스테이츠 4/12 - 웹 (0) | 2023.04.12 |