코드스테이츠 8일차

안형준·2022년 5월 4일
0

코드스테이츠

목록 보기
8/32
post-thumbnail

1차 학습 목표

  1. 자바의 4가지 특징을 이해할 수 있다.
  2. JVM의 기능과 필요성을 이해할 수 있다.
  3. JDK의 기능을 이해하고 설치할 수 있다.
  4. IntelliJ를 설치하고 실행할 수 있다.
👻자바의 특징
1. 운영체제에 독립적
자바 이전의 언어들은 특정 CPU에서만 작동하거나 OS에 따라 다르게 작성해야 하는(C, C++) 언어들이 대부분이였다. 자바는 이 문제를 해결하고자 모든 운영체제에서 실행이 가능하도록 만들어졌다.
2. 객체 지향 언어(Object Oriented Programming, OOP)
객체는 프로그램이 동작하는 부품이라고 생각하면 되는데, 여러 부품(객체)를 만들고 조립하여 하나의 프로그램을 실행하는 개념이 OOP이다. 이렇게 설계된 프로그램은 유지보수가 쉽고 확장성이 높다.
3. 함수형 프로그래밍 지원
자바 8버전부터 함수형 프로그래밍을 지원하는 문법인 람다식과 스트림이 추가되었다. 이를 사용하면 컬렉션의 요소를 필터링, 매핑, 집계 처리하기 쉬워지고 코드가 간결해지는 장점이 있다.
4. 자동 메모리 관리(Garbage Collection)
자바는 가비지 컬렉터(Garbage Collector)를 실행시켜 자동으로 사용하지 않는 메모리를 수거하기 때문에 개발자는 메모리를 관리하는 수고를 덜고 핵심 코드에 집중할 수 있게 되었습니다.

👻JVM과 JDK

JRE(Java Runtime Environment) : JVM + 표준 클래스 라이브러리
JDK(Java Development Kit) : JRE + 개발에 필요한 도구

JVM(Java Virtual Machine)
자바가 운영체제에 독립적인 것(운영체제에 따라 별도의 절차가 필요한 부분을 해결)은 JVM이 있기 때문이다. JVM은 자바 코드로 작성한 프로그램을 해석해 실행하는 별도의 프로그램이다. 하지만 JVM을 거치기 때문에 C나 C++에 비해 속도는 느린 편이다.

JDK(Java Development Kit) 
만약 자바 프로그램을 실행만 할 것이라면 JRE만 설치해도 상관없다. 그러나 우리는 자바 프로그램을 개발할 것이기 때문에 JDK를 설치해야 한다.
JDK는 OracleJDK와 OpenJDK가 있으며, OracleJDK는 오라클이라는 회사에서 관리하는 버전이고 OpenJDK는 오픈소스라는 것만 알아두자

👻자바의 키워드
클래스(Class)
클래스는 객체를 찍어낼 수 있는 틀이며, 객체의 구조를 클래스 내에 코드로 정의하면, 이후에 클래스를 활용하여 동일한 구조의 객체를 쉽게 생성할 수 있다.

main 메서드
메서드란 클래스 내부에 정의된 함수로서, 어떤 특정한 작업을 수행하기 위한 일련의 명령문을 모아놓은 집합이다.
자바 프로그램을 실행하면 main() 메서드를 가장 먼저 찾고, 그 안에 있는 것을 순차적으로 실행한다. 그렇기에 main() 안에 작성되지 않은 코드는 컴파일 과정에서 에러를 발생시킨다.

접근 제어자(Access Modifier)
자바에서는 어떤 클래스의 변수와 메서드를 다른 클래스에서 사용할 수 없도록, 혹은 사용할 수 있도록 지정할 수 있다. 이때 사용되는 것이 접근 제어자이다.
접근 제어자는 클래스, 변수, 메서드의 접근 권한을 정의할 때 사용하는 키워드로, 접근 제한자를 통해 아래처럼 4가지의 접근 권한을 설정할 수 있다.
public > protected > default > private
public : 모든 접근을 허용
protected : 같은 패키지(폴더)에 있는 객체와 상속 관계의 객체들만 허용
default : 같은 패키지(폴더)에 있는 객체들만 허용
private : 같은 클래스 내에서만 허용

static
클래스는 객체를 찍어내는 틀이고, 클래스 내부에 작성하는 코드들은 객체의 내용을 정의하는 코드들이다.
하지만, 특정한 경우에는 객체가 아니라 클래스 자신을 위한 내용이 필요할 때가 있다. 그러한 경우에 static을 사용한다. 즉, static은 변수나 메서드가 객체의 것이 아니라, 클래스의 속한 것임을 지정하는 키워드라 볼 수 있다.

return과 void
자바의 메서드는 리턴할 값의 타입(type)을 명시해줘야 한다. 메서드가 작업을 마치고 데이터를 반환하는 것을 ‘리턴한다'고 말한다.
따라서 데이터를 리턴하지 않을 경우 (명시적으로 return 키워드만을 쓰거나, return을 작성하지 않은 경우에 해당) void 키워드를 쓰고, 특정 타입을 리턴할 경우 타입을 따로 명시해줘야 한다.

변수(variable) : 하나의 값을 저장하기 위한 공간
상수(constant) :  값을 한번만 저장할 수 있는 공간
리터럴(literal) : 그 자체로 값을 의미하는 것

int  a =1 이랑 string a ='1' 이랑 형식은 똑같지만 후자는 '1'이 위치한 주소의 값을 갖는 것이다.
int a 에는 정수 1이 String a에는 '1'이 어디 있는지에 대한 주소값(예를 들어 ax23fd4 이런 식으로)

2차 학습 목표

  1. 타입의 개념을 이해하고 설명할 수 있다.
  2. 기본 타입과 참조 타입의 차이를 이해하고 설명할 수 있다.
  3. 정수 타입, 실수 타입, 논리 타입, 문자 타입의 개념을 이해할 수 있다.
👻기본 타입과 참조 타입
자바의 타입은 실제 값을 의미하는 기본 타입(primitive type)과 어떤 값이 저장된 주소를 값으로 갖는 참조 타입(reference type), 두 가지의 데이터 타입을 가지고 있다.

기본 타입(primitive type)
데이터의 실제 값을 의미
정수 타입(byte, short, int, long), 실수 타입(float, double), 문자 타입(char), 논리 타입(Boolean)

참조 타입(reference type)
데이터가 저장된 주솟값을 의미
객체의 주소를 저장, 8개의 기본형을 제외한 나머지 타입

👻정수 타입(byte, short, int, long)
byte : 1byte
short : 2byte
int : 4byte
long : 8byte

int의 범위에서 벗어나는 값을 쓰면 오류가 발생한다.
long longNumber = 12345678910;// 오류 (정수 범위를 벗어남)
long타입 에서는 long타입을 의미하는 L을 붙여주면 오류를 해결할 수 있다. L은 int 범위를 벗어날 때 붙인다고 이해하자
long longNumber = 12345678910L;

변수의 값이 자료형의 범위를 넘을 경우 오버플로우(overflow) 또는 언더플로우(underflow)가 발생하기 때문에 필요에 따라 long과 같은 타입을 사용한다. 하지만 너무 남발하면 성능에 문제가 생길 수 있으니 주의하자

오버플로우

자료형이 표현할 수 있는 범위 이상의 값을 표현한 경우 발생하는 현상
예 : 어떤 값이 byte형이고, byte형의 최댓값인 127을 값으로 가지는 경우, 이 값에 1을 더하면 128이 아니라 -128이 된다.

언더플로우

자료형이 표현할 수 있는 범위 이하의 값을 표현한 경우 발생하는 현상
예 : 어떤 값이 byte형이고, byte 형의 최솟값인 -128을 값으로 가지는 경우, 이 값에 1을 빼면 -129가 아니라 127이 된다.

byte형은 말 그대로 1byte의 크기를 가진 정수형 데이터 타입이며, 1byte는 8bit이므로 따라서 8자리의 이진수를 표현할 수 있다.
즉, 2의 8제곱 = 256개의 데이터를 표현할 수 있다. 부호를 감안하지 않는다면 0부터 255까지의 256개의 숫자를 1byte로 표현할 수 있다.
하지만 음수의 범위도 표현할 수 있어야 한다. 
이를 위해 8비트 중의 맨 앞의 비트를 부호 비트로 사용한다. 
즉, 맨 앞의 비트가 0이면 양수, 1이면 음수를 나타내게 되는데 이렇게 하나의 비트로 부호를 표현하고 나면 이제 남은 비트는 7비트이다. 
따라서 남은 7비트로는 2의 7제곱 = 128개의 숫자를 표현할 수 있다.
결과적으로, byte형은 8bit의 크기 중 1bit는 부호 표현에 사용하며, 7bit는 숫자 표현에 사용하여 -128 ~ 127의 정수 범위를 표현할 수 있게 된다.

👻실수 타입(float, double)
float 타입 : 4byte
double 타입 : 8byte
실수형 값 뒤에는 float형의 값인지, double 형의 값인지를 표현하기 위해 f 또는 d를 붙여야 한다.
하지만, double형은 실수형의 디폴트 값이기 때문에 d를 붙이는 것을 생략할 수 있다.
컴퓨터에서 실수를 저장할 때는 부동소수점 표현 방식으로 저장하는데, 이러한 방식은 효율적이지만 약간의 오차가 발생할 수 있다.
이 오차는 실수를 더 정밀하게 표현할수록 줄어든다. 여기서 얼마나 실수를 정밀하게 나타낼 수 있는지를 정밀도라고 하는데, 정밀도는 데이터 타입의 크기가 클수록 높아진다. 따라서 double형은 float형보다 정밀도가 더 높다.
정리하자면, double형은 float형보다
더 큰 실수를 저장할 수 있고, 더 정확하게 저장할 수 있습니다.

👻논리 타입(boolean)
true와 false가 있고, 단순히 참과 거짓을 0과 1로 저장하므로 단 하나의 비트만으로 표현할 수 있는데, JVM이 다룰 수 있는 데이터의 최소 단위가 1byte이기 때문에 1byte의 크기를 차지한다.

👻문자 타입(char)
char 타입의 변수는 단 하나의 문자만 저장할 수 있다. 여러 문자를 저장하기 위해서는 문자열(String)을 사용해야 한다.
자바에서 문자는 문자열과 다른 개념인데, 문자가 모여 ‘문자열'이 되지만, 둘은 다른 타입이라고 이해하자
char letter1 = '가'; // char 타입은 작은따옴표('')를 사용
System.out.println(letter1); //  '가'가 출력

char letter2 = 44032; // '가'의 유니코드값이다.
System.out.println(letter2); //  '가'가 출력

3차 학습 목표

String이 무엇인지 이해한다.
String을 선언하고 사용하는 법을 이해한다
String 메소드들을 이해한다.
StringTokenizer이 무엇인지 이해한다.
String Builder, Buffer이 무엇인지 이해한다.

👻String이란?
자바는 String 클래스 타입을 사용해서 문자열을 다룬다. 클래스는 그 자체로 타입으로 사용될 수 있으며, 연관된 기능들을 묶을 수 있기 때문이다.
다시말해, String 클래스는 문자열 타입으로 사용되며, 문자열과 관련된 유용한 메서드들을 가지고 있다.

👻String 클래스 선언
기본적으로 String 타입은 큰따옴표("")로 감싸진 문자열 타입이며, char의 배열을 의미한다.
문자열은 다른 변수가 값을 저장하는 방식처럼 작동하는 것이 아니라 문자열이 담겨 있는 주소를 참조한다고 이해하자
예를 들어, 책을 담는 두개의 상자가 있는데 첫번째 상자에는 책 실물이 담겨 있고 두번째 상자에는 책장에 꽃혀있는 책의 위치와 제목을 적어 놓은 종이가 들어가있다고 가정해보자
그러면 첫번째 상자에서는 언제든지 책을 직접 꺼내서 읽고 넣을 수 있는데, 두번째 상자는 책을 읽기 위해서 기록된 종이를 보고 책장에서 책을 찾아 읽어야 한다.
그리고 책을 모두 읽으면 첫번째 상자에는 그대로 책을 넣고 두번째 상자에도 위치가 기록된 종이를 건들지 않고 그냥 책장의 같은 자리에 책을 넣는다.
이 비유에서 첫번째 상자가 일반적인 변수가 값을 저장하는 방식이라면, 두번째 상자는 문자열을 다루는 방식이라고 생각할 수 있다.
즉, 문자열은 변수에 직접적으로 저장되는 것이 아닌 참조하는 주소가 담겨지는 것이다.

그런데 문자열을 변수에 담는 경우, 두가지 방법이 있는데 
1. 문자열 리터럴을 직접적으로 변수에 대입하는 방식과 
2. new 연산자를 사용해서 객체를 생성하는 동시에 문자열을 대입하는 방법이다.

문자열 리터럴로 생성을 하느냐, new 키워드로 생성을 하느냐에 따라 비교 연산자(==)의 결과는 달라질 수 있다. 아래의 예시를 참고하자

String name1 = "김코딩";
String name2 = "김코딩";
String name3 = new String("김코딩");

//case 1
System.out.println(name1 == name2); // -> true
//case 2
System.out.println(name1 == name3); // -> false

이 경우 name1과 name2는 동일한 문자열 리터럴로 생성된 객체를 참조하기 때문에, 비교 연산자(==)로 비교하였을 때, 결과는 true가 나온다.
그러나 name3은 new 키워드로 String 객체를 별도로 생성했기 때문에 주소 값이 다르다. 따라서 비교 연산자(==)로 비교하였을 때, name1과 name3은 false의 값을 가지게 된다.

👻대표적인 String 메서드
1. charAt() 메서드

charAt() 메서드는 해당 문자열의 특정 인덱스에 해당하는 문자를 반환한다. 만약 해당 문자열의 길이보다 큰 인덱스나 음수를 전달하면, 오류가 발생한다.
ex)
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() 메서드
compareTo() 메서드는 해당 문자열을 인수로 전달된 문자열과 사전 편찬(abcde) 순으로 비교한다. (두개의 값을 비교하여 int 값으로 반환해주는 함수이다.)
이 메서드는 문자열을 비교할 때 대소문자를 구분하여 비교하는데, 만약 두 문자열이 같다면 0을 반환하며, 해당 문자열이 인수로 전달된 문자열보다 작으면 음수를, 크면 양수를 반환한다.
만약 문자열을 비교할 때 대소문자를 구분하지 않기를 원한다면, compareToIgnoreCase() 메서드를 사용하자
ex)
숫자
Integer x = 3; Integer y = 4; Double z = 1.0; 

System.out.println( x.compareTo(y) ); // -1 System.out.println( x.compareTo(3) ); // 0 System.out.println( x.compareTo(2) ); // 1 System.out.println( z.compareTo(2.7) ); // -1

문자열
String str = "abcd";

1) 비교대상에 문자열이 포함되어있을 경우 System.out.println( str.compareTo("abcd") ); // 0 (같은 경우는 숫자나 문자나 0을 리턴) System.out.println( str.compareTo("ab") ); // 2 System.out.println( str.compareTo("a") ); // 3 System.out.println( str.compareTo("c") ); // -2 System.out.println( "".compareTo(str) ); // -4 

2) 비교대상과 전혀 다른 문자열인 경우 System.out.println( str.compareTo("zefd") ); // -25 System.out.println( str.compareTo("zEFd") ); // -25 System.out.println( str.compareTo("ABCD") ); // 32 }

3. concat() 메서드
concat() 메서드는 해당 문자열의 뒤에 인수로 전달된 문자열을 추가한 새로운 문자열을 반환한다.
만약 인수로 전달된 문자열의 길이가 0이면, 해당 문자열을 그대로 반환한다.
ex)
String str = new String("Java");
System.out.println("문자열 : " + str);
System.out.println(str.concat("수업"));
System.out.println("concat() 메서드 호출 후 문자열 : " + str);

4. indexOf() 메서드
indexOf() 메서드는 해당 문자열에서 특정 문자나 문자열이 처음으로 등장하는 위치의 인덱스를 반환한다. 
만약 해당 문자열에 전달된 문자나 문자열이 포함되어 있지 않으면 -1을 반환한다.
ex)
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() 메서드
trim() 메서드는 해당 문자열의 맨 앞과 맨 뒤에 포함된 모든 공백 문자를 제거해준다.
ex)
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() 메서드는 해당 문자열의 모든 문자를 대문자로 변환시켜 준다.
ex)
String str = new String("Java");
System.out.println("문자열 : " + str);
System.out.println(str.toLowerCase());
System.out.println(str.toUpperCase());
System.out.println("두 메서드 호출 후 문자열 : " + str);

👻StringTokenizer
StringTokenizer 클래스는 문자열을 우리가 지정한 구분자로 문자열을 쪼개주는 클래스이다.
그렇게 쪼개어진 문자열을 우리는 토큰(token)이라고 부른다.

int countTokens()
남아있는 token의 개수를 반환한다. 전체 token의 개수가 아닌 현재 남아있는 token 개수이다.
boolean hasMoreElements(), boolean hasMoreTokens()
문자열에서 분리할 토큰이 남아있는지 여부를 확인한다.
Object nextElement(), String nextToken()
이 두 메서드는 다음의 토큰을 반환한다. 
두 가지 메서드는 같은 객체를 반환하는데 반환형이 다르다.(nextElement는 Object를, nextToken은 String을 반환하고 있다.)

👻StringBuilder / StringBuffer
StringBuilder
한번 생성된 String 클래스의 인스턴스는 여러 개의 문자열을 더할 때 매번 새로운 인스턴스를 생성해야 한다.
이 문제를 해결하기 위해 StringBuilder를 사용한다.
ex)
StringBuilder sb = new StringBuilder(); sb.append("ABC"); sb.append("DEF"); System.out.println(sb.toString());

StringBuilder에는 append()가 있는데, 이는 문자열을 더하는 역할을 한다.

👻StringBuffer
String 클래스의 인스턴스는 한 번 생성되면 그 값을 읽기만 할 수 있고, 변경할 수는 없다. 하지만 StringBuffer 클래스의 인스턴스는 그 값을 변경할 수도 있고, 추가할 수도 있다.
이를 위해 StringBuffer 클래스는 내부적으로 버퍼(buffer)라고 하는 독립적인 공간을 가지는데,
버퍼 크기의 기본값은 16개의 문자를 저장할 수 있는 크기이며, 생성자를 통해 그 크기를 별도로 설정할 수도 있다.

덧셈(+) 연산자를 이용해 String 인스턴스의 문자열을 결합하면, 내용이 합쳐진 새로운 String 인스턴스를 생성하는데, 문자열을 많이 결합하면 결합할수록 공간이 낭비될 뿐만 아니라 속도 또한 매우 느려지게 된다.
하지만 StringBuffer 인스턴스를 사용하면 문자열을 바로 추가할 수 있으므로, 공간의 낭비도 없으며 속도도 매우 빨라진다.

1. append() 메서드
append() 메서드는 인수로 전달된 값을 문자열로 변환한 후, 해당 문자열의 마지막에 추가한다.
이 메서드는 String 클래스의 concat() 메서드와 같은 결과를 반환하지만, 내부적인 처리 속도가 훨씬 빠르다.
ex)
StringBuffer str = new StringBuffer("Java");
System.out.println("문자열 : " + str);
System.out.println(str.append(" programming"));
System.out.println("append() 메서드 호출 후 문자열 : " + str);

2. capacity() 메서드
capacity() 메서드는 StringBuffer 인스턴스의 현재 버퍼 크기를 반환한다.
ex)
StringBuffer str01 = new StringBuffer();
StringBuffer str02 = new StringBuffer("Java");
System.out.println(str01.capacity());
System.out.println(str02.capacity());
위의 예제처럼 길이가 4인 문자열로 StringBuffer 인스턴스를 생성하면, 기본적으로 생성되는 여유 버퍼 크기인 16에 문자의 길이인 4를 더한 총 20개의 문자를 저장할 수 있는 버퍼가 생성되는 것을 확인할 수 있다.

3. delete() 메서드
delete() 메서드는 전달된 인덱스에 해당하는 부분 문자열을 해당 문자열에서 제거한다.
또한, deleteCharAt() 메소드를 사용하면 특정 위치의 문자 한 개만을 제거할 수도 있다.
ex)
StringBuffer str = new StringBuffer("Java Oracle");
System.out.println("문자열 : " + str);
System.out.println(str.delete(4, 8));
System.out.println(str.deleteCharAt(1));
System.out.println("deleteCharAt() 메소드 호출 후 문자열 : " + str);
delete() 메서드를 사용하여 해당 문자열에서 인덱스가 4인 위치의 문자부터 7인 위치의 문자까지를 삭제하고 있는데,
이처럼 delete() 메서드는 첫 번째 매개변수로 전달된 인덱스부터 두 번째 매개변수로 전달된 인덱스 바로 앞의 문자까지를 삭제하는 메서드이다.

4. insert() 메서드
insert() 메서드는 인수로 전달된 값을 문자열로 변환한 후, 해당 문자열의 지정된 인덱스 위치에 추가한다.
이때 전달된 인덱스가 해당 문자열의 길이와 같으면, append() 메서드와 같은 결과를 반환한다.
ex)
StringBuffer str = new StringBuffer("Java Programming!!");
System.out.println("문자열 : " + str);
System.out.println(str.insert(4, "Script"));
System.out.println("insert() 메서드 호출 후 문자열 : " + str);
위 예제의 세번째 줄에서는 insert() 메서드를 사용하여 해당 문자열에서 인덱스가 4인 위치부터 두 번째 매개변수로 전달된 문자열을 추가하고 있다.

👻변수(Variable)란?
타입이 데이터의 종류라면, 변수는 데이터의 저장 공간을 의미한다.
String name1 = "김코딩";에서 사용한 name1 이 변수라고 볼 수 있다.
변수를 사용하는 이유는?
1. 메모리에 데이터의 저장 공간을 확보한다.
2. 다른 개발자와 협업 시 데이터에 이름(변수명)을 붙여 소통한다.
3. 데이터를 재사용한다.

👻변수의 선언과 할당
int number; // 정수 타입 변수명
// 변수를 선언한다.

number = 6;
// 선언한 변수에 값을 할당한다.

int number = 6;
// 선언과 할당을 동시에 할 수 있다. 
// 이처럼 선언과 할당을 동시에 하는 것을 '초기화'라고 한다. 
// 즉, '정수형 변수 number를 선언하고, 6으로 초기화한다'고 할 수 있다. 

또 다른 예제
int number = 6;
System.out.println(number); // 6이 출력된다.
number = 9 //number 변수에 9를 저장한다. 기존의 값 6은 삭제된다.
System.out.println(number); // 9가 출력된다.

👻변수명 짓기
변수명은 영문자(대문자, 소문자)나 숫자, _를 사용할 수 있다.
자바에서 변수명은 일반적으로 🐪 카멜 케이스(camelCase)를 사용한다. 두 번째 단어부터 대문자로 시작해 구분
int camelCase;

사용할 수 없는 변수명
1. 숫자로 시작하는 변수명
2. 자바에서 이미 사용 중인 예약어(reserved word)

👻상수
상수(Constant)는 변하지 않는 수이면서, 프로그램에서 변하면 안 되는 수, 즉 고정된 값이다.
일반적으로 고정된 값(특정 인물의 생년월일, 성별 등)이 될 수도 있고, 프로그래머가 생각하기에 변하지 않아야 하는 값이 될 수도 있다.
예를 들어 계산기를 만든다고 할 때 원주율의 값, 즉 pi(π)를 곱하는 연산을 한다면 매번 pi를 새로 쓰기보다는 상수로 선언해서 사용하는 것이 좋다. 숫자를 잘못 입력하는 실수도 방지하고, 코드 가독성도 높일 수 있기 때문이다.
자바에서는 상수는 최종을 의미하는 final 예약어를 사용해 선언합니다.
ex) final double CALCULATOR_PI  = 3.14;
상수는 일반적으로 대문자에 언더스코어(_)를 넣어 구분하는 😱🐍SCREAMING_SNAKE_CASE를 사용합니다.

상수를 쓰는 이유는?
1.오타로 인한 에러를 방지한다.
2. 변경하면 안 되는 값을 보존한다.
3. 데이터를 재사용한다

👻리터럴
프로그래밍에서 리터럴이란 문자가 가리키는 값 그 자체를 의미한다.
즉, 리터럴은 곧 값 그 자체다’라고 할 수 있다.
ex)
// 정수형 리터럴 20을 정수형 변수 currentAge에 할당
int currentAge = 20;

// 실수형 리터럴 3.14159를 실수형 변수 pi에 할당
double pi = 3.14159;

// 논리형 리터럴 true를 논리형 변수 boolean에 할당
boolean isGenius = true;

// 문자형 리터럴 'A'를 문자형 변수 firstAlphabet에 할당
char firstAlphabet = 'A';

// 문자열 리터럴 "CodeStates"를 문자열 타입 변수 learnedAt에 할당
String learnedAt = "CodeStates";

리터럴 사용 시 주의 사항
1. float 타입의 변수에 실수형 리터럴을 할당할 때, 접미사 f를 붙여주어야 한다.
2. long 타입의 변수에 정수형 리터럴을 할당할 때, 접미사 L을 붙여주어야 한다.
소문자 l을 붙여도 되지만, 숫자와의 혼동을 방지하기 위해 보통 대문자 L을 사용한다.
ex)
float weight = 74.5f;
final long LIGHT_YEAR = 9460730472580L;

👻타입 변환
자동 타입 변환
아래 두 경우에는 타입이 자동으로 변환된다.

1. 바이트 크기가 작은 타입에서 큰 타입으로 변환할 때
2. 덜 정밀한 타입에서 더 정밀한 타입으로 변환할 때 (ex. 정수 → 실수)

ex)
byte(1) -> short(2)/char(2) -> int(4) -> long(8) -> float(4) -> double(8)
// 괄호 안의 숫자는 바이트의 크기를 나타낸다.

여기서 float은 4byte인데 int와 long보다 더 뒤쪽에 있습니다. float이 표현할 수 있는 값이 더 정밀하기 때문이다.
long longValue = 12345L;
float floatValue = longValue;
// float이 long보다 정밀하므로, 자동으로 타입이 변환된다.

(ex)
System.out.println(floatValue); 
// 12345.0이 출력된다.

수동 타입 변환
메모리 용량이 더 큰 타입에서 작은 타입으로는 자동으로 타입이 변환되지 않는다. 
이때 더 큰 데이터 타입을 작은 데이터 타입의 변수에 저장할 수 있는데 이를 캐스팅(casting)이라고 한다.

캐스팅 연산자인 ()를 사용하고, 연산자 안에는 변환하고자 하는 타입을 적어주면 된다.

ex)
int intValue = 128;
byte byteValue = (byte)intValue;
//int 타입으로 선언된 변수 intValue를 더 작은 단위인 byte로 변환한다.
System.out.println(byteValue);
//출력값은 byte의 최대 표현 값인 127이 아니라 -128이다. 
//표현 범위를 넘으면 한 바퀴를 돌아 음수로 출력하기 때문이다.

타입 변환은 예전에는 중요한 개념이었지만, 메모리 용량이 넉넉해진 지금은 일반적으로 정수는 int 또는 long, 실수는 double로 사용하기 때문에 타입 변환을 일일이 계산해서 해줄 필요는 없다.

👻산술 연산자
산술 연산자는 우리가 흔히 말하는 사칙연산에 사용되는 연산자(+, -, *, /) 와 나머지 연산자(% 모듈로(modulo)라고도 한다.)를 포함한다.
% 앞에 있는 항에 뒤에 있는 항을 나누어 나머지를 구한다.

👻비교 연산자
비교 연산자는 boolean타입으로 평가될 수 있는 조건식에 사용되는데, 크게 대소 비교(>, <, <=, >=)연산자와 등가 비교(==, !=) 연산자가 있다.

👻조건 연산자
조건 연산자는 조건식, 참일 때 결과, 거짓일 때 결과 세 개의 피연산자를 필요로 하는 삼항 연산자이다.

equals() 는 문자열의 내용이 같은지 비교하기 위해 사용하는 메서드이다.
String은 참조 타입이기 때문에 ==등가 비교 연산자를 사용하게 되면, 값을 직접 비교하는 것이 아니라 주소값을 비교하게 된다.
따라서 문자열이 나타내는 내용을 비교하려면 equals()메서드를 사용해야 한다.
ex)
String answer; 
String name = "Kim Coding";

answer = name.equals("Kim Coding") ? "yes" : "no";
//name 변수의 값이 "Kim Coding"과 같으면 "yes" 다르면 "no"가 저장된다.
System.out.println(answer);
// "yes"가 출력된다.

👻연산자 우선순위
1. (),[] 괄호 / 대괄호
2. !, ~, ++, -- 부정/ 증감 연산자
3. *, /, % 곱셈 / 나눗셈 연산자
4. <, <=, >, >= 대소 비교 연산자
5. && AND 연산자
6. || OR 연산자
7. ? : 조건 연산자
8. =, +=, -=, /=, %= 대입/할당 연산자

👻콘솔 출력
프로그래밍을 하면서 변수에 담긴 값을 확인해야 할 필요가 있을 때, 콘솔에 출력할 수 있다.
콘솔에 값을 출력하기 위해서는 System.out.print(), System.out.println(), System.out.printf() 메서드를 활용한다.

1. 출력하기 : System.out.print()
System.out.print() 메서드는 소괄호 안의 내용을 단순히 출력하기만 하고, 줄바꿈을 하지 않는다.
ex)
System.out.print("Hello JAVA");
System.out.print("Kim" + "Coding");
System.out.print(3+6);
System.out.print(2022 + "year");
System.out.print(”Hello Java”)를 실행하면 소괄호 안의 “Hello Java”가 출력되고 커서는 “Hello Java”뒤로 이동

2. 출력하고 줄 바꾸기 : System.out.println()
System.out.println() 메서드는 소괄호 안의 내용을 콘솔에 출력하고 줄바꿈을 한다. print뒤에 붙은 ln은 line을 의미한다.
ex)
System.out.println("Hello JAVA");
System.out.println("Kim" + "Coding");
System.out.println(3+6);
System.out.println(2022 + "year");
System.out.println(”Kim Coding")을 실행하면 소괄호 안의 ”Kim Coding"이 출력되고 커서는 다음 줄로 이동한다.

3. 형식대로 출력하기 System.out.printf()
System.out.printf()는 지시자(specifier, 형식 지정자)를 이용해 변수의 값을 여러 형식으로 출력해주는 메서드이다.
지시자는 이름 그대로 값을 어떤 형식으로 출력할 것인지를 지정하기 위해 사용되고, f는 formatted의 약자이다.

지시자의 종류
%b   불리언
%d   10진수
%o   8진수
%x, %X   16진수
%c   문자
%s   문자열
%n   줄바꿈

ex)
System.out.printf("%s%n", "Hello JAVA"); // 줄바꿈이 된다.
System.out.printf("%s%n", "Kim" + "Coding");
System.out.printf("%d%n", 3+6); 
System.out.printf("지금은 %s입니다", 2022 + "year"); // 자동 타입 변환이 일어난다.
System.out.printf("나는 %c%s입니다", '김', "코딩"); //여러 개의 인자를 넣을 수 있다.

👻콘솔 입력
import java.util.Scanner;                 // Scanner 클래스를 가져온다.
Scanner scanner = new Scanner(System.in); // Scanner 클래스의 인스턴스를 생성합니다.
String inputValue = scanner.nextLine();   // 입력한 내용이 inputValue에 저장된다.
System.out.println(inputValue);           // 입력한 문자열이 출력된다.

1. import java.util.Scanner;
데이터를 입력받는 기능을 작은 프로그램으로 만들어둔 것이 Scanner이다. 
이 Scanner는 java.util이라는 위치에 저장되어져 있고, Scanner를 사용하려면 먼저 작성하고 있는 소스코드 안으로 불러와야 한다.
즉, import java.util.Scanner;는 ‘java.util에 있는 Scanner를 이 소스 코드로 불러와라’라는 의미가 된다.

2. Scanner scanner = new Scanner(System in);
위에서 불러온 Scanner는 클래스이다. 클래스는 객체를 찍어낼 수 있는 일종의 틀이며, 우리가 사용하고자 하는 Scanner 클래스의 데이터 입력 기능은 Scanner 클래스 자체가 아니라, 그것을 통해 만들어낸 객체에 존재한다. 
따라서 데이터 입력 기능을 사용하려면 Scanner 클래스를 통해 객체를 먼저 만들어야 한다.

클래스를 통해 객체를 만들어 낼 때에는 new 연산자를 사용하며, 그 결과물로 만들어진 객체를 인스턴스라고 한다.

즉, 위의 코드는 불러온 Scanner 클래스를 new 연산자를 통해 인스턴스를 생성하고, 생성된 인스턴스를 변수 scanner에 할당하는 코드이다.

3. String inputValue = scanner.nextLine();
위에서 Scanner 클래스를 인스턴스화한 scanner에는 nextLine()이라는 메서드가 존재한다.
이 메서드는 콘솔을 통해 문자열 데이터를 입력 받는 기능을 수행한다.
즉 scanner.nextLine()은 문자열을 입력받기 위한 코드이며, 입력받은 문자열은 inputValue라는 변수에 할당되어 저장된다.

참고로, scanner에는 문자열을 입력받는 nextLine()뿐만 아니라, 정수형을 입력받을 수 있는 nextInt(), 실수형을 입력받을 수 있는 nextFloat()등의 메서드들도 존재한다.

오늘은 자바 기초에 대해서 학습했다. 자바에 대해서 어느정도 예습을 하고 왔지만, 이렇게까지 상세한 부분은 파악하지 못했던 거 같아 학습하는 데 있어서 흥미를 느꼈다. 하지만 그와 동시에 다른 사람들은 나보다 더 잘하는 거 같아보여 불안함 마음도 솔직히 들었다. 하지만 남과 비교하여 자신은 되지 않을 것이라고 생각만 해서는 절대로 성공할 수 없다. 그렇기에 이미 잘하는 사람들과 굳이 비교하면서 하지 않고 나 자신이 잘할 수 있도록 더더욱 노력하면 될 일이다. 앞으로도 더 힘내서 좋은 개발자가 되자! 오늘도 고생했고 파이팅!!!

profile
개발 공부

0개의 댓글