JAVA 문법 뽀개기

Walter Mitty·2022년 5월 16일
0

JAVA

목록 보기
1/21

*TIL을 한 페이지에 정리하면 너무 길어서 시리즈로 출간합니다!

JAVA 언어의 특징

  • 목적

    • 객체 지향적 프로그래밍 돼야 한다.
    • 한번 코드를 작성하면 그게 어디서나 돌아가야 한다.
      (윈도우에서 코드를 작성하면 윈도우에서만 돌아가는게 아니라 맥이든, 아이폰이나 안드로이드나 컴퓨터든 모바일이든 디바이스 어디든 실행할 수 있도록 환경을 제공해준다.)
    • JRE (위에 언급한 그 환경)
    • 안정성이 좋다.
      (오랜 기간 사용된 언어이기 때문에 축적되어있는게 많음)
    • 오픈소스 라이브러리가 많다.
    • 백엔드 서버 개발에 많이 쓰인다.
    • 하드웨어 실행 환경, 핸드폰이냐 컴퓨터냐에 구애 받지 않고 싶은 모든 곳에서 자바 사용 가능
  • 단점

    • 오래 전에 정해진 자바의 문법 때문에 유연하고 견고한 코드 작성이 어려움. (한계를 벗어나지 못함 따라서 이걸 보완한 코틀린, 고랭과 같은 언어가 생겨남)
  • 장점

    • 가장 배우기 쉬운 객체지향언어이다 : 오래 사용되어온 만큼 레퍼런스가 많다.
    • 언어 다르더라도 실행 환경이 자바의 구동환경인 JVN이라는 머신에서 동작하는 언어들이 꽤 많다. 같은 JVM 상에서 돌아가면 다른 언어로 짠 코드더라도 유효해짐(대표적인 언어로 스칼라, 코틀린이 있다.)
    • JAVA 개발자 수요가 높다

변수와 상수

변수 : 어떠한 데이터를 저장하기 위한 메모리 공간의 이름이다. 지속적으로 변수의 값을 변경할 수 있다.
맨 처음에 내가 원하는 데이터를 변수로 지정해 놓으면 그 데이터를 매번 기억하지 않고도 그 변수의 이름을 떠올려서 쓸 수 있다.
"=" 이라는건 프로그래밍 언어에서 할당이라고 표현한다.

  • 정수형 변수
int number = 5;
System.out.println(number);

number가 아니라 5가 출력된다.
앞에서 내가 선언했던 5를 number라는 변수에 저장을하고 내가 맨 처음에 저장했던 숫자가 5였는지, 6이었는지 매번 기억할 필요없이 number라는 변수를 통해 5를 대신해서 불러올 수 있다.

  • 문자형 변수
String sparta = "Hello Sparta";
System.out.println(sparta);

Hello Sparta가 출력된다.

  • 상수: 중간에 값이 변할 수 없으며 초기값을 끝까지 사용해야 한다.
    똑같은 변수인데 앞에 final을 붙여서 선언한다.
    _final이란 접근제어자인데 있을 수도 있고, 없을 수도 있다.그 다음이 변수의 자료형(int/String), 변수의 이름은 아무거나 써도 되지만 첫글자에 숫자나, 특수문자가 오면 안된다. 변수 이름에 camel case의 규칙을 따라 언더바가 아닌 첫글자는 소문자, 다음 단어의 첫글자는 대문자로.
final int finalNumber = 1;
System.out.println(finalNumber);

하면 1이 나오는데 이때,

final int finalNumber = 1;
System.out.println(finalNumber);
finalNumber = 2;
System.out.printlb(finalNumber);

하면 2가 안나오고 'finalNumber라는 final variable에는 값을 할당할 수 없어요' 라는 error가 뜬다.
(error: cannot assign a value to final variable finalNumber.)

그러면 상수는 다른 값으로 재할당이 안된다고 하면, 일반 변수는 재할당이 가능하다는 말이다.
그래서 앞에 final이 안 붙었다는 건 변수 라는 말이고, 변수 는 값의 재할당이 가능하다.

자료형

크게 두 종류가 있다. 기본/참조
1. 기본 자료형(Primitive Type)

  • 숫자(자료형)
    • short: 2(두)바이트로 표현할 수 있는 자료
    • int: 4바이트
    • long: 8바이트
    • float: 소수점
    • double: 소수점을 조금 더 큰 범위로 표현
short s = 1;
System.out.println(a);

int a = 3; // 정수형 변수 선언
System.out.println(a);

long b = 1234567890L; // Long 정수형 변수 선언
System.out.println(b);

float c = 5.5F; // float 실수형 변수 선언
// F는 float라는 타입을 가리키는 거지 실제 값으로 인식하진 않는다. print해도 안찍힘.
System.out.println(c);

double d = 9.12345678901234567890d; // double 실수형 변수 선언
System.out.println(d);

// 다음처럼 각 자료형의 MAX, MIN 값을 가져올 수 있습니다. 어디서부터 어디까지인지 범위를 알고 싶을 때,
System.out.println(Short.MAX_VALUE);
System.out.println(Short.MIN_VALUE);
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);
System.out.println(Long.MAX_VALUE);
System.out.println(Long.MIN_VALUE);
System.out.println(Float.MAX_VALUE);
System.out.println(Float.MIN_VALUE);
System.out.println(Double.MAX_VALUE);
System.out.println(Double.MIN_VALUE);

프린트를 했을 때

1
3
1234567890
5.5
9.12345678901234567890
  • 문자(char)
    char는 Character의 약어다. 글자 하나만 표현하기 때문에, 'ABC' 이렇게 담을 수 없다.
char c = 'A'; // 문자형 변수 선언, ' 작은 따옴표로 감싸기.
System.out.println(c);
// char type은 default 값이 없습니다.
  • 논리(boolean)
    true or false의 값만 가질 수 있다. 단순 출력문보다는 어떤 경우의 수를 판단하는 반복문, 조건문 등에 더 잘 쓰인다.
boolean fact = true; // 논리형 변수는 true, false의 값을 가진다.
System.out.println(fact);
// boolean type은 default 값이 없습니다.
  • 바이트(byte)
    문자(char)와 다른점은,
byte data = 'd'; 
System.out.println(data); // 알파벳 d는 ASCII code 에서 십진법으로 100이기 때문에 100이라는 글자가 출력됩니다.

하면,

100

d가 아니라 100이 출력되는데, 사실 컴퓨터에 표현되는 모든 데이터는 사실상 byte의 연속이다. 알파벳 d는 사실상 아스키코드에서 십진법으로 100이기 때문에 100이 출력되었다.
아스키코드는 사람이 인식하는 문자를 실제로 컴퓨터는 어떻게 인식하는지 정의해놓은 코드이다.

  1. 참조 자료형(Reference Type)
    기본 자료형이 아닌 모든 것을 참조 자료형이라고 한다.(예: String)
    JAVA의 인스턴스, 객체를 가르킬 수 있는 자료형이다.
  • 클래스와 배열
    • 클래스
String sparta = "Hello sparta";
System.out.println(sparta);

int[] intArray = new int[] {1,2,3,4,5}; // int 배열을 선언과 동시에 초기화
System.out.println(Arrays.toString(intArray));

여기서 mac - cmd를 누르고 커서를 String으로 가져가면 커서가 손바닥 모양으로 바뀌는데, 이때 String 을 클릭하면 String이 선언된 구현체로 넘어간다.

public final class String
.
.
.

JAVA 언어를 개발한 사람들이 미리 만들어 놓은 걸로, class로 정의된 타입을 쓸 때는 다 참조 자료형이다. 라고 이해하면 된다.

  • 배열
    배열이란 동일한 자료형, 여기서는 int인데 자료형의 데이터를 연속된 공간에 저장하기 위한 자료 구조이다. 왜 필요하냐? 예를 들어서 10명의 학생의 점수를 입력할 때, 배열이란게 없다면 변수를 10개 선언해야하게 된다. 하지만 int 배열이 있다면 int 배열에 scores(int[scores]) 해서, 10개든 100개든 하나의 변수안에 숫자의 연속을 담을 수 있게 된다.

int[ ] 에서 [ ]는 배열이라는 뜻인데, int[ ] 이 정확히 말해서 int는 아니다.int를 여러개 담을 수 있는걸 int배열이라고 하고, 기본형이 아니기 때문에 참조자료형에 들어간다.

int[] intArray = new int[] {1, 2, 3, 4, 5};
System.out.pringln(Arrays.toString(intArray));

int 배열로 만들면서 1, 2, 3, 4, 5로 초기화한 코드이다.
출력하면

[1, 2, 3, 4, 5]

이것처럼, 배열로 출력이 된다.
배열에서 몇번째를 의미하는 걸 index라고 하는데 index n번이라고 하면 n번째 데이터라고 생각하면 된다. 컴퓨터에서의 첫번째 인덱스는 0번부터 시작한다.

선언방법 1: 아무것도 할당하지 않는 방법

int[] intEmptyArray = new int[5]; //아직 아무런 값을 할당하지 않은 다섯 개 짜리의 int[]을 선언.
System.out.println(Arrays.toString(intEmptyArray)); //실제로 Array는 Arrays.toString으로 감싸줘야 우리가 아는 [, , ] 형식으로 이쁘게 나온다.

선언방법 2: 선언과 동시에 초기화 하는 방법

int[] intArray = new int[] {1, 2, 3, 4, 5}; //사이즈를 입력해 주지 않고 1 ~ 5를 적어주면 자동으로 5개 짜리 배열이 된다.
System.out.println(Arrays.toString(intArray));
String[] stringEmptyArray = new String[5];
System.out.println(Arrays.toString(stringEmptyArray));

String[] season = {"봄", "여름", "가을", "겨울"};
System.out.println(Arrays.toString(seoson));

실행하면,

[0, 0, 0, 0, 0] -아무것도 할당 안했을 때
[1, 2, 3, 4, 5] -설정 동시에 초기화
[null, null, null, null, null] -아무것도 할당 안했을 때
[봄, 여름, 가을, 겨울] -설정 동시에 초기화

0을 할당한 적 없는데 왜 0이 나왔을까?
Array 같은 경우는 선언만 하고 초기화 하지 않으면 해당하는 타입의 초기화되는 값을 디폴트로 가지게 된다.
int같이 정수는 기본값이 0이어서 0을 할당해주지않아도 0이 다섯개인 배열이 된다.
String 처럼 Reference type같은 경우는 JAVA에서 아무것도 없다 라는걸 표현하는게 null이므로, 프린트하는 함수에서 null이라고 표현하고 null이라는 글자가 아니라 '아무것도 없다.'라는 뜻이다.

Tip

  • 노란줄, 빨간줄이 그어지면 잘 읽어보자.
  • 마지막에 있는 배열값을 출력하고 싶을 땐
System.out.println(season[season.length -1]);

배열은 인덱스 번호를 0부터 세니까 마지막 값은 lengh에서 1을 빼줘야 그게 실제로 마지막 값이 나오게 된다.
겨울은 5번째 인덱스지만 컴퓨터에선 4번째에 해당하므로, length(5)에서 -1을 해줘야 4가 나와서 마지막 값이된다. length 자체는 그 배열의 값의 갯수니까.

Quiz1

문자형 변수 S, 정수형 변수 10을 선언하고 출력해보자

char quiz1 = 'S';
int quiz2 = 10;

System.out.println(quiz1);
System.out.println(quiz2);

를 하면

S
10

이 출력되는데,
이 때 같은 줄에 출력하고 싶다면 어떻게 해야할까?

char quiz1 = 'S';
int quiz2 = 10;

System.out.println(quiz1 + quiz2);

이렇게 하면 93이 출력되는데, 이건 S가 아스키코드 상으로 83이어서 83+10인 93이 출력되게 되는 것이다.

따라서,

char quiz1 = 'S';
int quiz2 = 10;

System.out.println(quiz1 + "" + quiz2);

이렇게 중간에 ""을 해주고 출력하면 된다.

S10

행을 분리하고 싶다면

char quiz1 = 'S';
int quiz2 = 10;

System.out.println(quiz1 + "\n" + quiz2);

""안에 (백슬래쉬)n을 넣어주면

S
10

으로 출력된다.
\n 은 컴퓨터한테 개행(행을 바꾸는 것)을 해줘! 라고 말해주는 것이다.

Quiz2

위 두가지 방법으로 해도 똑같이 30이 나오는데, quiz1처럼 선언과 동시에 할당하면 더 편하다!

0개의 댓글