JAVA공부 [1. JAVA의 기본 문법(1)]
1. 🔥 자바 기본 문법
기본적으로 class header부분과 class body부분으로 나눠져있다.
자바의 클래스 파일을 생성할 때에는 항상 주의해야 하는점이 있다.
문법적 강제사항
- 하나의 자바 소스코드 파일에는 하나이상의 클래스가 존재해야 한다..!
- 위에서 말한 클래스는 소스코드 이름과 같아야 한다.
- 또한 그 클래스는 public으로 선언되어야 한다.
- 위에서 말한 조건을 갖춘 public클래스는 소스코드 파일에 단 하나만 존재해야 한다.
위의 조건을 지킨 클래스 파일
다른 언어들과 유사하게 자바에도 main함수가 존재하는데 이는 클래스 안에 public static으로 즉, 정적으로 선언이 되어 소스코드 자체를 실행시킬 수 있다.
기본적인 main선언 방식이며 인자는 String으로 미리 받는다.(관련 플래그 받을려고)
여기서 중요한 점은 자바는 하나의 클래스가 하나의 프로그램이다.
하나의 클래스가 다른 클래스를 호출하며 덩치가 커지긴 하겠지만 하나의 클래스가 하나의 프로그램이라고 알고있어야 한다.
- 만약 실행가능한 프로그램이라면 그 클래스안에는 당연하게 main이 존재한다는 뜻이다.(위의 3가지 사항을 다 지켰을 경우)
1.1. 클래스 이름의 약속
모든 언어에 존재하는 강제는 아니지만 자바도 기본적인 약속이 있다.
- 클래스의 이름은 대문자로 시작하여 여러 단어가 붙을 때 마다 대문자로 시작한다. ex) MyClassName
- 위에서 말했지만 클래스의 이름과 소스코드의 이름이 같아야 한다.(public class 기준)
- **_, 알파벳, $으로 시작가능..!** 그외 특수문자 숫자 불가능
- 또한 미리 정의된 키워드는 변수이름으로 사용 불가능
자바언어의 이름 붙이는 관습 -> Hungarian Notation
- 클래스 이름: 첫 번째 문자는 대문자로 시작하여 각 단어 첫번째 문자만 대문자
- 변수,메소드 이름: 첫 단어 이후 각 단어의 첫 번째 문자는 대문자로 시작
- 상수 이름: 모든 문자를 대문자로 표시
1.2. 출력
자바는 출력을 하기 위해 console창 객체를 호출한다.
- System.out -> 콘솔창을 의미함. 하나의 객체, 오브젝트로 인식
println에서 ln은 line을 의미하고 한줄을 출력하는 메서드임을 알 수 있다. ++ c언어와 달리 \n없이 println으로 줄바꿈 가능
C언어의 기반이기 때문에 printf또한 지원한다.
1.3. 자료형
자료의 타입, 자바에도 다양한 종류가 존재한다.
데이터 타입
- 정수형(기초형): byte(c언어의 char)/1바이트, short/2바이트, int/4바이트, long/8바이트
- 실수형(기초형): float/4바이트, double/8바이트
- 논리형(기초형): boolean/1비트 or 1바이트
- 문자형(기초형): char/2바이트 -> 대중화 때문
- 참조형: 실제 객체를 가리키는 주소를 저장(클래스,인터페이스,배열)
각 자료형마다 할당되는 메모리의 크기도 전부 다르다. (참조형 제외)
기초형은 실제 값이 저장되고 참조형은 실제 객체를 가르키는 주소를 저장한다.
- 기초형을 선언할 경우 그 즉시 메모리가 집힌다..!
변수의 이름 약속
- 식별자는 유니코드 문자와 숫자의 조합(한글 가능하지만 비선호)
- 식별자의 첫 문자는 일반적으로 유니코드 문자
- 두 번째 문자부터 문자, 숫자,-,&가능
- 대문자와 소문자 구별
- 이름으로 키워드(미리 정의된 ex) if) 사용불가!
변수 오버플로
byte형에 128을 넣게 되면 음수처리가 되며 +1더해지기 때문에 -127이 출력된다..!
1.4. 리터럴
리터럴이란, 코드상에 직접적으로 보이는 값들 즉, 하드코딩의 값들을 의미한다.
ex) 34,42.1,’h’,true 등등
정수 리터럴
- 10진수: 15 -> 15
- 8진수: 13 -> 015
- 16진수: 21 -> 0x15
- 2진수: 5 -> 0101
실수 리터럴
가장 많이 실수하게 되는 것이 C언어에선 자동형변환이 지원이 되었지만 자바에서는 지원하지 않기 때문에 발생하는 오류가 많다.
float temp = 25.6; // 25.6처럼 실수를 그대로 적으면 double형이라 오류
float temp = 25.6f; // 뒤에 f를 붙여줘야 함..(long은 l)
기본적으로 double사용을 권장.
문자 리터럴
char형은 오로지 문자만 기억할려고 만든 자료형으로 2바이트를 할당 받는다.
이는 국제적으로 다양한 문자를 받을 수 있게 하기 위해서 2바이트로 할당되어 있다.
char ch = 'A';
char ch1 = '아';
c언어와 차이점은 문자 여러개를 배열로 만들어 문자열을 만드는 것이 아닌 문자열
이 따로 존재한다. String(클래스)
String은 기본데이터 타입이 아닌 클래스이다..!
논리 리터럴
정수값이 논리형으로 사용되는 C와 다르게 자바는 오직blooean타입을 사용해야 한다.
-
true, flase
boolean done = false;
출력값처럼 정수가 아닌 false자체로 찍혀 나오는 걸 확인할 수 있다.
boolean done = 10 > 3; //참 거짓 결과값 자체를 저장가능
상수
자바에서 상수는 final이라는 키워드를 붙여서 사용한다.
final double PI = 3.141592;
여기서 주의해야하는 점은 상수의 식별자는 대문자로 선언해야 한다는 점과 선언시 초기화를 진행해야 한다는 점이다. (이후 값 변경 불가능)
c언어는 const, defind사용
‘_‘허용!
숫자 리터럴에서 컴파일러는 ‘_‘빼고 처리한다.
int age = 2_______5; //가능
int x = 15_; //불가능 끝에 사용x
long car = 123_456_456; //가능
int y = 0_x15 //불가능
1.5. var
auto타입의 변수형으로 C#이나 최근 언어들에서 많이 등장하고 있는 자료형이다.
var a = 3.14;
//컴퓨터가 double형으로 판단하여 a->double타입할당
3.14는 명확하게 double타입이니까 가능하다…!(float는 뒤에 f붙여야함)
위 사진 처럼 사용가능하지만 만약 추론이 불가능한 경우에는 오류가 난다.
int a;
a = 1000 //가능! 이미 자료형을 지정했기 때문
var a; //오류 발생! 자료형이 명확하지 않음
c언어는 auto라는 키워드 사용
1.6. 타입 변환
자동 타입 변환
- 작은 타입에서 큰 타입으로의 변환은 전혀 문제없이 컴파일시 이루어짐.
long a = 25; // 2는 int타입이지만 long타입으로 변환된다.
double b = 3.14 * 10 // 실수 연산을 하기 위해(피연산자가 실수) 10 -> 10.0으로 자동변환 된다.
강제 타입 변환
- 큰타입에서 작은타입으로 변환할 때 문제가 발생함.
double d = 1.9;
int n = (ind)d; // n = 1 강제 형변환으로 0.9손실발생
2. 🔥 입력
System.out으로 출력을 했다면 입력은 System.in으로 입력받을 수 있다.
- System.in은 전역변수처럼 생각하면 편한데 이미 만들어져 있는 객체이다.
사용자가 어떠한 값을 입력하면 키값을 바이트코드로 넘겨주기 때문에 이에 대한 정보를 문자정보로 변환해야함..!
Scanner클래스
java.util패키지에 있는 Scanner클래스 기본라이브러리가 아님!
- System.in에게 키를 읽게 하고, 읽은 바이트를 문자, 정수, 실수, 불린, 문자열등 다양한 타입으로 변환하여 리턴
import java.util.*;
//import java.util.Scanner; 가능..!
public class JavaBasic {
public static void main(String[] args) throws Exception {
Scanner input = new Scanner(System.in); //위에서 말한 키를 읽는 객체 System.in을 스캐너(유틸 클래스)의 객체 생성자로 호출하여 input객체 생성
int age = input.nextInt(); //생성된 번역기? 라고 생각하면 좋겠다. 앞서 말한 바이트 코드를 nextint즉 정수로 변환하여 반환한다.
float score = input.nextFloat(); //구분되어 있는 다음 소수를 입력받아서 반환하겠다..!
System.out.println(a+" "+b); // 만약 사용자가 정수 실수를 입력하지 않고 다른 값이 버퍼에 존재한다면 예외 출력
}
}
- 여기서 next란 사용자가 입력한 값은 전부 버퍼에 들어가 있는데 next는 구분(스페이스, 엔터등 / 화이트 스페이스 아스키코드 9~13)을 통해서 하나씩 빼오는 것을 의미
여기서 구분된 단어? 문자열? 을 토큰이라고 함
- 정수형을 입력받아 정수형으로 출력하는 것이 nextInt();
-
문자열을 입력받아 문자열로 출력 next(); 그냥 next 맞습니다.!
- 그렇다면 이름을 입력받는 경우 next() -> jeong lee 이경우엔 jeong만 들어가거나 오류가 난다.(뒤에 받는 인자값이 String아닌경우)
그렇다면 구분문자 없이 한줄을 입력 받고 싶다면?
- nextLine()을 사용한다..!
2.1. 연산자(operators)
+, -, *, /, %
a+b -> +(a,b) //이때 반환 자료형은 정밀도가 높은 순서를 따라간다. int < double
14/3 -> 4 // 나머지 버림
14/3.0 -> 1.666666 //double자료형 따라감
String 연산
String s1 = "fkdl"; //fkdl문자열의 주소값을 가리킴
String s2 = "hello"; //hello문자열의 주소값을 가리킴
String s3 = s1+s2; // 새로운문자열 fkdl hello을 생성하고 그곳을 가리킴
System.out.println("x+"+x); //이때 '+'연산자의 피연산자중 하나라도 문자열이라면 나머지 자료형을 문자열로 치환하여 계산된다.
---
public class JavaBasic2 {
public static void main(String[] args) throws Exception {
int x = 10;
int y = 20;
System.out.println("x + y =" + x + y); //x + y = 1020
System.out.println(x + y + "= x + y"); //30 = x + y
}
}
문자열 결합조건의 성질을 이용한 예제이다.
System.out.println("x + y =" + x + y);
이 부분은 문자열(“x + y =”) + 정수형(x) -> 문자열(“x + y = 10”)
문자열(“x + y = 10”) + 정수형(y) -> 문자열(“x + y = 1020”)
이렇게 계산되게 된다.
System.out.println(x + y + "= x + y");
이 부분은 정수형(x) + 정수형(y) -> 정수형(x+y)
정수형(30) + 문자열(“= x + y”) -> 문자열(“30 = x + y”);
따라서 System.out.println("x + y =" (x + y));
도 같은 결과값을 가진다.
연산자 우선순위
크게 정리하자면
- 형변환, 단항연산자
- 곱하기 나누기
- 덧셈 뺄셈
- 비교 연산
- 비트 논리 연산 //주의..! 괄호 사용할 것!
- 논리 연산
- 삼항연산
- 할당연산자
count = count + 1; // count에 1을 더한다음에 count에 덮어씌움
count++; //count자체가 1 증가시킴 효율성이 더 좋음
- 둘의 결과는 같지만 동작방식은 크게 다르다..!
비트연산
byte x = 10; -> x[00001010]
실제 저장되는 모습
- 위와 같은 비트를 and,or,xor/시프트 연산을 하는 것을 비트연산이라고 함
만약 byte와 byte를 연산한다고 한다면 출력값은 byte가 출력된다.
댓글남기기