💡 Java 기초
Java의 특징
- 운영체제에 독립적
- OOP
- 함수형 프로그래밍 지원 (lambda , Stream)
- 자동 메모리 관리 (garbege Collector에 의한 메모리 관리)
JRE (Java Runtime Environment) : JVM + 표준 클래스 libJDK (Java Development Kit) : JRE + 개발에 필요한 도구
Java에서 main method는 진입점 함수임.
- ⭐ 위 코드에서 public class main {} 은 다음을 의미함
- 접근 허용범위가 public인 main이라는 class를 정의함 (main이라는 class 안에 코드작성가능)
- ⭐ 위 코드에서 public statis void main(String[] args] {} 는 다음을 의미함
- void main은 나중에 배울 class와 관련됨 개념이니 소거하고, 간편식 A main(B C) { D }
- A main(B C) { D } 는 method를 정의하는 문법.
Method 란?
- 어떤 기능을 하는 코드를 묶음으로 묶은것, 어떠한 기능을 수행하기 위한 일련의 코드들의 집합체
- 함수의 개념에 가까움
함수: 특정 기능을 수행하는 코드들을 묶은것
메소드: 클래스 내에 포함되어 있는 함수
* 자바는 객체지향 언어이며, 모든 코드를 클래스 내에 작성하기 때문에 보통 함수보다는 메소드라는 용어 사용.
void main (String[] args) { code }
A(반환타입) main(메소드이름) (B매개변수타입 C매개변수이름) {메소드_바디}
[A] 반환타입 void
- A는 반환타입을 의미 , 처리결과를 일종의 '값'의 형태로 반환되며, 이를 반환값 이라고함
- 값에는 정수형,문자형,논리형 등이 있음 (데이터 타입이라고도함)
- 즉 A는 데이터의 값을 반환할 타입을 의미하며, 메소드를 정의할때 메소드 이름앞에 반환타입을 명시해주어야함
[B,C] 매개변수타입 , 매개변수이름
- 데이터를 입력받음. 메소드 외부에서 메소드 내부로 전달되어진 값.
- 외부로부터 전달받은 값으 저장하고있는 변수 = 매개변수
- 어떤 유형값의 값을 메소드가 입력받을것 인지를 명시함.
- 메소드를 정의할때는 매개변수타입과 매개변수의 이름을 공백으로 구분하여 명시해야함.
[D] 메소드 바디
- 구체적으로 어떤 기능을 수행할지에 대한 코드를 작성하는 부분
- return 키워드를 사용해 어떠한 값을 반환할 수 있음.
메소드 호출
메소드를 정의하는것만으로 실행이 되지않음, 메소드를 실행시키려면 메소드를 아래처럼 호출을 해주어야 함.
() 안에는 위에 언급한 매개변수에 넣어줄 값을 입력하면 됨.
의사 코드 - 슈도 코드(pseudo code) 란?
- 프로그래밍 언어로 코드 작성 전, 어떤 과정을 통해 만들지 사람의 언어로 먼저 작성하는것
💡 변수
값을 저장할 수 있는 메모리 공간에 사람이 식별할 수 있는 이름을 붙인것 (메모리 주소 사용 x)
개념
- 기억하고자 하는 값이 얼만큼의 메모리 공간을 필요로 하는지 파악
- 기억하고자 하는 값이 차지하는 용량만큼의 메모리공간 확보
- 확보한 메모리 공간에 기억하고자 하는 값 저장
- 값을 저장한 공간에 이름을 붙임
위 과정에서 1,4번이 중요함
1번
- 어떤 값을 기억하기전 그 값을 저장하기위해 필요한 메모리 공간의 크기를 알아야함.
- 타입별로 차지하는 메모리 공간의 크기가 각각 다름.
4번
- 어떤 값을 메모리에 저장 후, 해당 값에 접근 하려면 이름이 무조건 있어야함.
- 이것을 변수라고함
아파트를 예로 들어보자
ㅣ 메모리 ㅣ - ㅣ 아파트 ㅣ
ㅣ메모리 셀의 집합체ㅣ ㅣ 집의 집합체 ㅣ
ㅣ각셀에 데이터 저장ㅣ ㅣ각 집에 사람 거주 ㅣ
ㅣ각 셀의 주소가있음ㅣ ㅣ각 집의 호수가 있음ㅣ
변수 선언 / 값 할당
int num; // 변수 선언
num = 1; // 값 할당(초기화)
num = 2; // 값 할당(재할당)
int num = 1; // 선언과 동시에 초기화
💡 타입
어떤값의 유형 및 종류를 의미하며 타입에 따라 값이 차지하는 메모리 크기와, 값이 저장되는 방식 결정
값이 차지하는 메모리 공간의 크기
- 정수형 타입의 데이터 = 4byte
- 문자형 타입의 데이터 = 1byte
값이 저장되는 방식
- 값을 그대로 저장하는 기본타입, 저장값을 임의의 메모리 공간에 저장후, 그 메모리 공간의 주소를 저장하는 참조타입
기본타입(primitive type)
- 값을 저장할때, 데이터의 실제 값이 저장됨.
- 정수(byte,short,int,long) , 실수(float,double) , 문자타입(char) , 논리 타입(boolean)
참조타입(reference type)
- 값을 저장할때, 데이터가 저장된 곳을 나타내는 주소값이 저장됨.
- 객체의 주소를 저장, 8개의 기본형을 제외한 나머지 모든타입
- 위 예시에서 참조타입변수는 저장하고자 하는것이 존재하는 위치를 저장함.
- 객체를 어떤 변수에 저장한다면 그 변수에는 객체가 존재하는 메모리 주소를 값으로 가짐
- 즉, 객체의 주소값이 변수에 저장되어있음
출력값
> Task :Test.main()
1
java.lang.Object@626b2d4a <- 참조타입변수의 객체에 저장된 메모리 주소
정수 타입
byte, short, int, long
정수형의 오버 & 언더플로우
ex) byte type = -128 ~ 127
- 127 이상으로 값이 넘어갈경우 오버플로우
- -128 이하로 내려갈경우 언더플로우
* 최대값인 127을 넘어갈경우 최소값인 -128로 순환됨
* 최소값인 -128을 내려갈경우 최대값인 127로 순환됨
실수 타입
float, double
실수타입의 오버 & 언더플로우
- 값이 음의 최소범위 또는 양의 최대범위를 넘어갔을때 발생, 이때 값은 무한대
- 값이 음의 최대범위 또는 양의 최소범위를 넘어갔을때 발생, 이때 값은 0
논리 타입
boolean
문자 타입
char
- 문자 타입의 변수를 선언하면 해당 변수에 오직 하나의 문자형 리터럴을 지정할 수 있음.
- 문자형 리터럴은 ' '(작은 따옴표)만 사용가능
ex) 문자형 char letter1 = 'a';
숫자를 문자형 변수에 할당 char letter = 65;
java는 문자를 유니코드로 저장 a -> 유니코드 a의 숫자반환
65 -> 유니코드 65의문자 반환
타입변환
boolean을 제외한 기본타입 7개는 타입 변환가능하며, 자동/수동 타입변환 방법이 있음
자동타입변환
바이트 크기가 작은 타입에서 큰타입으로 변환할 때 (ex: byte -> int)
덜 정밀한타입에서 더 정밀한 타입으로 변환할 때 (ex: int -> float)
float이 정수형보다 뒤에있는 이유는 float으로 표현할 수 있는 값이 모든 정수형보다 더 정밀하기 때문
byte(1) - short(2)/char(2) - int(4) - long(8) - float (4) -> double(8)
수동타입변환
- 바이트 크기가 큰타입에서 작은타입으로 자동변환 X
- 큰 -> 작은 = 자동변환불가,캐스팅이라고 불림
💡 상수
- 재할당이 금지된 변수. 변수와 같이 선언-할당-사용이 가능하지만 재할당이 금지되어있음.
- 상수는 final이라는 키워드를 사용해 선언할 수 있으며, 관례적으로 대문자에 _를 넣어 구분하는 형태를 사용
- ex) final double CALCULATOR_PI = 3.14;
상수를 사용하는 이유
- 프로그램이 실행되면서 값이 변하면 안되는 경우
- 코드의 가독성 높이기 위함 (값을 저장하고있는 상수명으로 값을 사용가능하기 때문)
- 코드 유지관리를 손쉽게
💡 Literal
'문자 그대로의' 라는뜻을 가짐, 문자가 가리키는 값 그 자체
literal 사용시 알아야하는 사항
- float 타입의 변수에 실수형 리터럴을 할당할 시, 뒤에 접미사 f를 붙여주어야 함.
- long 타입의 변수에 정수형 리터럴을 할당할 시, 뒤에 접미사 L을 붙어주어야 함.
- 소문자 l을 붙여도 되지만, 숫자와의 혼동방지를 위해 보통 대문자 L 사용
💡 String
문자열 클래스
" "(큰따옴표) 사용
- 자바는 다른타입과는 다르게 문자열만 class를 통해 다룸
- class는 그 자체로 타입으로 사용될 수 있으며, 연관된 기능들을 묶을 수 있음
- 즉, String class = 문자열 타입이며 , 그 안에 있는 메소드들을 통해 여러 문자열 관련 메소드 사용 가능
위의 2가지의 공통점과 차이점
- class로 instance를 찍어내고자 할때 new 연산자를 사용
- String 타입의 변수는 String 변수명; 으로 선언 가능
- 선언한 변수에 문자열을 할당하는 방법
- 문자열 리터럴 : 변수 = "문자열";
- String 클래스의 인스턴스를 생성하여 할당 : 변수 = new String("문자열");
공통점
- 참조타입의 변수에 할당됨
- 문자열의 내용을 값으로 가지고 있는게 아니라, 문자열이 존재하는 메모리 공간상의 주소값을 저장하고있음.
- 하지만 출력해보면 주소값이 아닌 문자열의 내용 출력됨
Why?
equals() 메소드
- . 앞의 변수가 저장하고 있는 문자열의 내용과 ()안의 문자열의 내용이 같은지 비교하여 boolean 값 출력
- 내용이 같은지만 비교하는 메소드
1번 방법
- name1 / name2는 1번의 방법인 문자열 리터럴을 String 타입의 변수에 직접 할당함.
- 동일한 문자열리터럴을 두 변수에 할당하는경우, 두 변수는 같은 문자열의 참조값 공유
2번방법
- String 클래스의 인스턴스를 생성하여 String 타입의 변수에 할당하는 방법
- 클래스의 인스턴스를 생성하면 문자열의 내용이 같아도, 별개의 인스턴스가 따로 생성됨
- name3 / name4가 할당받은 인스턴스의 참조값은 서로 다름. 즉 서로 다른 주소값 저장하고 있음
Comparison 1~7
Comparison1
- name1은 Kim Coding 이라는 문자열 리터럴을 직접할당, 우항 또한 같은내용이기에(같은 주소값) true 반환
Comparison2
- name1 / name2도 내용이 같은 문자열 리터럴 직접할당 받은 변수, 두 변수는 같은 문자열의 참조값이므로 true 반환
Comparison3
- name3에서 인스턴스를 생성하여 할당받은 변수이며, 주소값이 달라서 false 반환
Comparison4
- String 클래스토 인스턴스를 생성하면 항상 별개의 인스턴스 생성 = 다른 주소값 = false 반환
Comparison5
- equals() 는 내용이 같은지만 비교하므로 true (참조값도 같음)
Comparison6
- equals()는 내용이 같은지만을 비교하므로 true (참조값 다름)
Comparison7
- equals()는 내용이 같은지만을 비교하므로 true (참조값 다름)
String Class의 Method
charAt()
- 해당 문자열의 특정 인덱스에 해당하는 문자 반환
- 해당 문자열의 길이보다 큰 인덱스나 음수를 전달하면 오류 발생
compareTo()
- 해당 문자열을 인수로 전달된 문자열과 사전 편찬 순으로 비교함.
- 문자열 비교 시 대소문자 구분
- 두 문자열이 같다면 0 반환, 해당 문자열이 인수로 전달된 문자열보다 작으면 음수, 크면 양수 반환
- 대소문자를 구분하지 않기를 원한다면 compareToIgnoreCase() 를 사용
concat()
- 문자열의 뒤에 인수로 전달된 문자열을 추가한 새로운 문자열 반환
- concat은 concatenate의 약자로 사전적으로 연결을 의미
- 인수로 전달된 문자열의 길이가 이면, 해당 문자열을 그대로 반환
출력값
문자열 : Java
Java수업
concat() 메서드 호출 후 문자열 : Java
indexOf()
- 문자열에서 특정문자나 문자열이 처음으로 등장하는 위치의 인덱스 반환
- 문자열에 전달된 문자나 문자열이 포함되어 있지 않으면 -1을 반환
출력값
문자열 : Oracle Java
-1
2
7
indexOf() 메서드 호출 후 원본 문자열 : Oracle Java
trim()
- 문자열의 맨앞과 맨뒤에 포함된 모든 공백문자 제거
출력값
문자열 : Java
Java |
Java|
trim() 메서드 호출 후 문자열 : Java
toLowerCase() 와 toUpperCase()
- toLowerCase() 문자열의 모든 문자를 소문자 변환
- toUpperCase() 문자열의 모든 문자를 대문자 변환
출력값
문자열 : Java
java
JAVA
두 메서드 호출 후 문자열 : Java
💡 연산자
산술연산자 (주의점)
- 나눗셈/나머지 연산자를 사용할때는 우항에 0 이 위치할 수 없음
- 나눗셈 연산자를 사용할때 좌/우 항이 모두 int 형이면 그 결과도 int 형이기 떄문에 소수점 이하의 값은 버려짐
- 좌/우 항중 하나라도 실수 타입이 존재한다면 실수 타입이 아닌 값도 자동 형변환되어 계산됨
증감연산자
- ++ 이 앞에붙으면 전위형 증감연산자 , ++이 뒤에붙으면 후위형 증감연산자
- 전위형 증감연산자 = 증감 연산을 먼저 수행후 그 결과값 적용
- 후위형 증감연산자 = 기존 값을 먼저 적용시키고 그 다음 증감연산
복합대입연산자
대소 비교 연산자
- boolean을 제외한 나머지 기본 타입에 모두 사용가능
- 주의할 점
- x가 1보다크고 5보다 작다" 를 표현할때 1 < x < 5 가 아닌 1 < x && x < 5 같이 논리연산자를 사용해 작성
등가 비교 연산자
- 값이 동등하면 true , 다르면 false
- and(&&) = 두개가 모두 true 일때 1 반환, 두개중 하나라도 false면 0 반환
- or (||) = 두개중 1개라도 true 일때 1 반환, 모두 false 일경우만 false 반환
- not (!) = 반대
연산자 우선순위
- () , [] 괄호 / 대활호
- ! , ~ , ++ , -- 부정 / 증감 연산자
- * , / , % 곱셈 / 나눗셈 연산자
- < , <= , > , >= 대소 비교 연산자
- && AND연산자
- || OR연산자
- ?: 조건 연산자
- = , += , -= , /= , %= 대입/할당연산자
💡 입출력
출력
System.out.[print , prinft , println]()
- print = 소괄호 안의 내용을 단순히 출력하기만 하고 줄바꿈 X
- println = 소괄호 안의 내용을 콘솔에 출력 후 줄바꿈
- printf = 지시자를 이용해 변수의 값을 여러 형식으로 출력해주는 메소드
- %x , %X = 16진수
- %b = boolean
- %d = 10진수
- %o = 8진수
- %c = 문자
- %s = 문자열
- %n = 줄바꿈
ex) System.out.printf("현재 %d 년도입니다.", 2022);
입력
Scanner 클래스를 import 하자
1. import java.util.Scanner;
- 데이터를 입력받는 기능을 작은 프로그램으로 만들어 둔 것 = Scanner
- 즉, import java.utile.Scanner; 는 java.util에 있는 Scanner를 이 소스코드로 불러오라는 뜻
2. Scanner scanner = new Scanner(System.in);
- 사용할 입력기능은 Scanner Class 자체가 아니라 그것을 통해 만들어진 객체에 존재하므로 객체 먼저 생성
- Class를 통해 객체생성을 할때는 new 연산자를 사용하며, 그 결과물로 만들어진 객체 = 인스턴스
- ↑와 같은 작업을 '클래스를 인스턴스화 한다' 라고도 함.
3. String inputValue = scanner.nextLine();
- 위에서 Scanner 클래스를 인스턴스화한 scanner 에는 nextLine() 이라는 메소드가 존재함.
- 이 메소드는 콘솔을 통해 문자열 데이터를 입력받는 기능 수행
- 즉, scanner.nextLine()은 문자열을 입력받기 위한 코드이며, 입력받은 문자열은 inputValue라는 변수에 할당,저장됨
scanner에는 정수형을 입력받는 nextInt() , 실수형을 입력받는 nextFloat() 등의 메소드들도 존재함
'Languages > Java' 카테고리의 다른 글
Constructor & this & Inner Class (0) | 2022.09.05 |
---|---|
클래스 & 객체 & 필드 & static & 메소드 (0) | 2022.09.02 |
배열 (0) | 2022.09.01 |
제어문 & 반복문 (0) | 2022.08.31 |
예약어 (0) | 2022.08.09 |