[Java] 2. 기본 문법

seungwon·2021년 6월 10일
0

Java

목록 보기
2/5

목차

  • 자바프로그램의 기본 구조
  • 클래스
  • 메소드
  • 자바 키워드
  • 데이터 타입
  • 변수
  • Literal
  • 상수
  • 타입 변환
  • 자바에서 키 입력
  • 식 & 연산자
  • 배열
  • 참고 자료 (사진 출처)

자바프로그램의 기본 구조

클래스

field (멤버 변수) 와 메소드 (멤버 함수)로 구성된다

메소드

C/C++에서의 함수

main() 메소드

  • 자바 프로그램은 main()에서 실행 시작
  • public static void으로 선언
  • String[] args로 실행 인자를 전달 받음
public static void main(String[] args){ 
	..
}

화면 출력 관련 메소드 (표준출력)

System.out.print() // 여러 타입의 데이터 출력 가능, 문장 끝에 줄바꿈 없음
System.out.println() // 문장 끝에 줄바꿈 있음


## 식별자 클래스, 변수, 상수, 메소드 등에 붙이는 이름
  • 특수문자 ,공백, 탭은 식별자로 사용 불가능
  • ' _ ', ' $ ' 는 사용 가능 (식별자 첫 문자로 사용도 가능하나 일반적이지는 않음)
  • 유니코드 문자, 한글 사용 가능
  • 자바 언어의 키워드는 식별자로 사용 불가능
  • 식별자의 첫번째 문자로 숫자는 사용 불가능
  • true, false, null 사용 불가능
  • 길이 제한 없음
  • 대소문자 구분

naming convention

CamelCase

  • 클래스 : 대문자로 시작, 명사
  • 메소드 : 소문자로 시작, 동사
  • 변수 : 모든 문자 소문자
  • 상수 : 모든 문자 대문자, 언더바(_)로 구분
    ex) MIN_WIDTH
  • 패키지 : 모두 소문자, 최상위 도메인명(com, edu, gov, mil, net, org)으로 시작
    ex) com.sun.eng, com.apple.quicktime.v2

자바 키워드



데이터 타입

  1. 기본 타입(primitive type) : 8개
  • 타입 명세가 암시적으로 존재 (코드상에 있지 않음)
  • 기본타입의 크기가 정해져 있음 (cpu나 운영체제에 따라 변하지 않음)
  • unsigned 타입 존재하지 않음

    boolean, char, byte, short, int, long, float, double

  1. 레퍼런스 타입 (reference type) : 1개
  • 기본타입이 아니다 = 레퍼런스 타입이다
  • 타입 명세가 명시적으로 있음
  • 참조값을 갖고 heap에 할당된다.
  • Array(배열), enum, Class, String, Interface

    타입 명세 : 데이터 타입을 만드는 행위

  • JVM에서 처리하는 boolean 의 실제 크기는 명세에 정해져 있지 않아서 가상머신에 따라 다를 수 있지만 java에서는 포인터가 없어 상관없음.
  • C/C++ 에서는 int의 크기가 컴퓨터 종류
    (32비트 컴퓨터 - 4byte / 64비트 컴퓨터 -8byte)에 따라 다르다
    <-> JVM에서 처리하기 때문에 java에서는 int의 크기 일정

변수

int radius;
radius = 10; 
radius = 10 * 5;

대입연산자'=' 뒤에 오는 것은 "식" (expression)

var 키워드

  • 변수 타입 선언 생략 : 컴파일러가 변수 타입 추론
  • 변수 선언문에 반드시 초깃값 지정 (초깃값이 없으면 변수 타입을 추론할 수 없음)
var price = 200; // price -> int로 추론
var name = "seungwon"; // name -> String
var pi = 3.14; // pi -> double

"식을 평가(evaluate) 하다"

  • compiler 가 식을 평가한다.

  • 식을 평가하면 값이 나온다

    a = 3 + 5 ; // 3 + 5 를 계산한다 = 식을 평가한다

  • 한 문장 전체 = statement

    d = a + b * 3 - 4
    // statement

  • statement라고 해서 expression인 것은 아님

    int a;
    // statement는 맞지만, expression 은 아님

  • 식 평가에는 자동형변환을 포함한다.

  • 식 평가의 차이

    a = 10 ;

  1. 이 식을 10으로 평가 하는 경우

    a=b=c=d=10;
    compile OK

  2. 이 식을 10으로 평가하지 않는 경우

    a=b=c=d=10;
    compile Error

Literal

프로그램에서 직접 표현한 값

  • type check 가 필요하다
  • 정수, 실수, 문자, 논리, 문자열 리터럴이 있음
    ex) 34, 42.195, '%', true, "hello"

  • 정수 리터럴 : int타입으로 컴파일
    10진수, 8진수(0으로 시작), 16진수(0x로 시작), 2진수 리터럴(0b로 시작)
    long 타입은 숫자 뒤에 L/l 붙여 표시
  • 실수 리터럴 : double타입으로 컴파일
    숫자 뒤에 f(float)나 d(double)을 명시적으로 붙이기도 함

숫자 리터럴 사이사이에 '_' 허용
ex. int exnum = 10_1000_1000;


  • 문자 리터럴 : ' '로 문자 표현, 특수문자 리터럴

    '   '로 문자 표현 = \u + 2바이트(4자리 16진수)의 유니코드
       ex) \u0041 = 문자 'A'의 유니코드

    특수문자 리터럴: \로 시작

  • 논리 리터럴 : true, false
    boolean 타입의 변수에 치환하거나 조건문에 이용
    1,0을 참/거짓으로 사용 불가능

  • null 리터럴 : 레퍼런스에 대입하여 사용, 기본타입에는 사용 불가
    ex. String str = null;

  • 문자열(String) 리터럴 : String 객체로 자동 처리

상수

실행 중 값을 변경 불가능

  • final 키워드 사용
  • 선언시 초기값 지정
final double PI = 3.141592;
.
.
PI = 3.14; // error

타입 변환

byte < short < int < long < float < double

  1. 자동 타입 변환 : 작은 타입은 큰 타입으로 자동 변환 (컴파일러에 의해)
    할당문(=) / 식 내에서 타입이 일치하지 않을 때

    ex. short + long -> long + long -> long
  • byte, short -> int (연산시에ㅇ, 할당시에x)
    ex. byte + short -> int + int = int
  1. 강제 타입 변환 : 큰 타입이 작은 타입으로 변환할 때
    개발자가 필요하여 강제로! 값 손실 우려가 있음
int n;
byte b = (byte)n; // 강제 타입 변환 - 값 손실 우려

자바에서 키 입력

  • System.in : 키보드로부터 직접 읽는 자바의 표준 입력 스트림
    키 값을 바이트로 리턴 -> 문자로 변환해야 함
  • java.util.Scanner 클래스 : System.in에게 키를 읽게 하고 읽은 바이트를 다양한 타입으로 변환하여 리턴

객체 생성

import java.util.Scanner; 
...
Scanner a = new Scanner(System.in); //Scanner 객체 생성

Scanner를 이용한 키 입력 (원리)

  1. Scanner는 입력되는 키 값을 공백으로 구분되는 토큰 단위로 끊어 읽는다 .
    (키보드로 입력한 건 모두 String)
  2. Enter 치면 Scanner로 들어간다.
  3. 원하는 다양한 타입의 값으로 변환한다.

주요 메소드

ex.

import java.util.Scanner;
public class ScannerEx {
	public static void main(String args[]) {
		System.out.println("이름, 도시, 나이, 체중, 독신 여부를 빈칸으로 분리해 입력하세요");
		Scanner scanner = new Scanner(System.in); 
        
		String name = scanner.next(); // 문자열 읽기
		System.out.print("이름은 " + name + ", ");
        
		String city = scanner.next(); // 문자열 읽기 		
		System.out.print("도시는 " + city + ", ");
        
		int age = scanner.nextInt(); // 정수 읽기 			
		System.out.print("나이는 " + age + "살, ");
        
		double weight = scanner.nextDouble(); // 실수 읽기 
		System.out.print("체중은 " + weight + "kg, ");
        
		boolean single = scanner.nextBoolean(); // 논리값 읽기 
		System.out.println("독신 여부는 " + single + "입니다.");
        
		scanner.close(); // scanner 닫기
	} 
}

식 & 연산자

연산 : 주어진 식을 계산하여 결과를 얻어내는 과정

연산자 우선순위

  • 산술 연산자 : +, -, *, /, %
  • 증감 연산자 : ++(후위,전위), --(후위,전위)
  • 대입 연산자
  • 비교 연산자
  • 논리 연산자
  • 조건 연산자 : 삼항연산자(condition ; ? opr2 : opr3, if-else)
  • 비트 연산자 : 비트 논리 연산자, 시프트 연산자

비트 연산

  • 비트 개념
  • 비트 논리 연산 : AND, OR, XOR, NOT
  • 비트 시프트 연산

배열

인덱스와 인덱스에 대응하는 데이터들로 이루어진 자료 구조 (fixed-length)

cf. linked-list : 필요할때마다 메모리를 할당

  • C랑 달리 배열의 시작주소를 가리키는 것은 아님

  • 배열을 만들면 객체가 만들어지고 그 안에 배열이 존재
    객체 : 메모리에 존재 = run time에 존재, heap에 생성됨(heap에 있는 변수는 0으로 초기화 됨)

  • 배열 선언 / 생성

  1. 선언
// (1) 
int arr[];

// (2)
int[] array;
  1. 생성
//(1)
arr = new int[10]; // new : 연산자

//(2)
char charArr[] = new char[20];
  • 배열의 크기 : length 필드
int arr[];
arr = new int[5];

int size = arr.length; //출력값 : 5
  • 2차원 배열

  • 비정방형 배열(ragged array)

  • 메소드에서 배열 리턴 : 리턴 타입에 배열의 크기를 지정하지는 않음

int[] testArray(){
	...
 }

조건문

  1. if (if-else)
  2. switch
    case 문에 break문이 없으면 break를 만날 때까지 다음 case로 넘어가며 계속 실행.
    case 문의 값 : 문자, 정수, 문자열만

반복문

  1. for문
  • 여러 문장 나열 가능
for(i=0;i<10;i++, System.out.println(i)){
	..
}
  • enhanced for(for-each) : 각 배열 요소에 접근할 때 (수정 불가)
int[] nums = {1,2,3,4,5};

for(int i:num) 
// int 타입 i는 num의 각 요소값으로 설정됨
	System.out.print(i); // 출력 :12345
  1. while
  2. do-while

참고 자료 (사진 출처)

명품 Java Programming(황기태, 김효수 저)

0개의 댓글