우주먼지
article thumbnail

💡 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

'문자 그대로의' 라는뜻을 가짐, 문자가 가리키는 값 그 자체

위 변수에서 num = 1 부분의 1이 literal임

 

literal 사용시 알아야하는 사항

  • float 타입의 변수에 실수형 리터럴을 할당할 시, 뒤에 접미사 f를 붙여주어야 함.
  • long 타입의 변수에 정수형 리터럴을 할당할 시, 뒤에 접미사 L을 붙어주어야 함.
  • 소문자 l을 붙여도 되지만, 숫자와의 혼동방지를 위해 보통 대문자 L 사용


💡 String

문자열 클래스

 

 " "(큰따옴표) 사용

  • 자바는 다른타입과는 다르게 문자열만 class를 통해 다룸
  • class는 그 자체로 타입으로 사용될 수 있으며, 연관된 기능들을 묶을 수 있음
  • 즉, String class = 문자열 타입이며 , 그 안에 있는 메소드들을 통해 여러 문자열 관련 메소드 사용 가능

 

String Type의 변수 선언 / 문자열 리터럴 할당

 

위의 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()

  • 해당 문자열의 특정 인덱스에 해당하는 문자 반환
  • 해당 문자열의 길이보다 큰 인덱스나 음수를 전달하면 오류 발생

문자열의 각 문자를 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
profile

우주먼지

@o귤o

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그