연산자와 연산식
  • 연산(operations) : 프로그램에서 데이터를 처리하여 결과를 산출하는 것
  • 연산자(operator) : 연산에 사용되는 표시나 기호
  • 피연산자(operand) : 연산되는 데이터
  • 연산식(expressions) : 연산자와 피연산자를 이용한 연산 과정을 기술한 것

[연산자 종류]

  • 단항, 이항, 삼항 연산자 순으로 우선순위를 가진다.
  • 산술, 비교, 논리, 대입 연산자 순으로 우선순위를 가진다.
  • 단항과 대입 연산자를 제외한 모든 연산의 방향은 왼쪽에서 오른쪽이다.
  • 복잡한 연산식에는 괄호()를 사용해서 우선순위를 정해준다.

[연산자 우선순위]

  • 부호 연산자의 결과는 int 타입이므로, 결과를 산출하는 데이터의 타입을 int 형으로 바꾸어야 한다.
  • ++i 의 속도는 i=i+1 보다 연산 속도가 빠르다.
    • 후자는 = 연산자, + 연산자의 총 두 번의 연산이 필요하다.
    • 전자는 ++ 하나의 연산만 수행한다.
    • 하지만 실제로 컴파일하면 동일한 바이트 코드가 생성된다. 때문에 둘 중 어떤 것이 연산 속도가 빠르다고 볼 수는 없다.
  • 비트 반전 연산자(~)의 결과는 int 타입이므로, 결과를 산출하는 데이터 타입을 int 형으로 바꾸어야 한다.
  • Integer.toBinaryString() : 정수 값을 총 32비트의 이진 문자열로 리턴하는 메소드 
  • long 타입을 제외한 정수의 산술 연산은 무조건 int 타입으로 변환 후 연산을 수행한다. 그 이유로는 JVM이 기본적으로 32비트 단위의 계산을 하기 때문이다.
  • 산술 연산을 하기 전에 피연산자들의 값을 조사해서 오버플로우를 방지하자. 프로그램 실행 도중 예외가 발생하면 실행이 멈추고 프로그램이 종료된다. 이러한 경우 예외 처리를 해야 한다.
  • Nan & Infinity 연산 
    • 아래의 메소드를 사용해 Infinity와 NaN이 산출되면, 다음 연산을 수행하지 않는다. 
    • Double.isInfinite() 메소드 사용
    • Double.isNan() 메소드 사용
  • String 타입의 문자열 비교
    • strVar1, strVar2 동일한 String 객체의 번지수
    • strVar3 객체 생성 연산자인 new로 생성한 새로운 String 객체의 번지수
    • ==  연산자는 변수에 저장된 값만 비교한다. -> equals() 메소드 사용

[서로 다른 객체의 번지 값]

String strVar1 = "ABC";
String strVar2 = "ABC";
String strVar3 = new String("ABC");

System.out.println( strVar1 == strVar2);    // true
System.out.println( strVar1 == strVar3);    // false

System.out.println( strVar1.equals(strVar2));   // true
System.out.println( strVar1.equals(strVar3));   // true

 

  • 비트 연산자
    • 데이터를 bit 단위로 연산한다.
    • 정수 타입만 비트 연산이 가능하다.
    • 비트 논리 연산자(&, |, ^, ~) 
    • 비트 이동 연산자(<<, >>, >>>)

[비트 이동 연산자]

 

  • 삼항 연산자
    • 세개의 피연산자를 필요로 하는 연산자
    • ? 앞의 조건식에 따라 콜론(:) 앞 뒤의 피연산자가 선택된다고 해서 조건 연산식이라고 부르기도 한다.
    • 조건식 ? 값 또는 연산식(true) : 값 또는 연산식(false)
public class ConditionalOperationExample {
    public static void main(String[] args){
        int score = 85;
        char grade = (score > 90) ? 'A' : ((score > 80) ? 'B' : 'C');
        // 첫 번째 조건에서 90보다 작기 때문에 score > 80 으로 이동
        // 두 번째 조건에서 80보다 크기 때문에 'B'의 값을 얻게 된다. 
        System.out.println(score + "점은 " + grade + "등급입니다.");
    }
}

'프로그래밍 > JAVA' 카테고리의 다른 글

Ch06. 클래스  (0) 2022.01.02
Ch05. 참조 타입  (0) 2022.01.01
Ch04. 조건문과 반복문  (0) 2022.01.01
Ch02. 변수와 타입  (0) 2022.01.01
Ch01. 자바 시작하기  (0) 2022.01.01
변수 (Variable)
  • 값을 저장할 수 있는 메모리의 공간
  • 프로그램에 의해서 수시로 값이 변동될 수 있다.
  • 하나의 타입, 하나의 값만 저장이 가능하다.

 

변수명 작성 규칙
  • 첫 번째 글자는 문자이거나 '&', '_' 이어야 한다. 숫자 불가능
  • 영어 대소문자 구분
  • 첫 문자는 영어 소문자로 시작, 다른 단어가 붙을 경우 첫 문자를 대문자로
  • 문자 수 길이의 제한 X
  • 예약어 사용 불가능

 

예약어 

[자바의 예약어]&nbsp;

 

리터럴 (literal)
  • 소스 코드 내에서 직접 입력된 값을 리터럴 이라고 부른다.
  • 정수 리터럴, 실수 리터럴, 문자 리터럴, 논리 리터럴

 

정수 리터럴 - byte, char, short, int, long
  • 10진수 : 소수점이 없는 정수 리터럴 
    • 0, 75, -100
  • 8진수 : 0으로 시작되는 리터럴 
    • 02, -04
  • 16진수 : 0x 또는 0X로 시작하고 0~9 숫자나 A~F 또는 a~f로 구성된 리터럴
    • 0x5, 0xA, 0xB3, 0xAC08

 

실수 리터럴 - float, double
  • 10진수 : 소수점이 있는 리터럴
    • 0.25, -3.14
  • 10진수 지수와 가수 : 대문자 E 또는 소문자 e 가 있는 리터럴 
    • 5E7(5x10^7), 0.12E-5(0.12x10^-5)

 

문자 리터럴 - char
  • 작은 따옴표(')로 묶은 텍스트를 하나의 문자 리터럴로 간주한다.
    • 'A', '한', '\t', '\n'

 

문자열 리터럴 - String
  • 큰 따옴표(")로 묶은 텍스트는 문자열 리터럴로 간주한다.
    • "대한민국", "탭 만큼 이동 \t 합니다."

 

논리 리터럴 - boolean
  • true / false

 

이스케이프 문자 
  • 이스케이프(escape) : 역슬래쉬( \ ) 가 붙은 문자 리터럴

[이스케이프 문자 종류]

 

변수의 사용 범위
  • 로컬 변수(local variable) : 메소드 블록 내에서 선언된 변수. 메소드 실행이 끝나면 메모리에서 자동으로 없어진다.
  • 변수는 선언된 블록 내에서만 사용 가능
  • 메소드 블록 첫머리에 선언 권장

 

데이터 타입
  • 기본 타입(primitive) : 정수, 실수, 문자, 논리 리터럴을 직접 저장하는 타입
  • 비트(bit) : 최소 기억 단위
    • 8 bit = 1 byte

[데이터 기본 타입의 메모리의 크기와 저장되는 값의 범위]

 

  • 정수 타입(byte, char, short, int, long) 
    • 자바의 기본 정수 연산 Int
    • byte와 short는 범위를 초과할 수 있는 위험이 있다.
    • 최소값과 최대값을 넘으면 최소값부터 다시 시작한다. 
      • ex) byte ~128에서 127일 경우, -128 부터 시작

[byte(var1), int(var2) 타입 예시]

 

  • char 타입
    • 자바는 모든 문자를 유니코드(Unicode)로 처리한다.
    • char 타입 변수를 int 타입에 저장하면 유니코드를 알 수 있다.
    • char c = ''; 컴파일 에러 -> char c = ' ';
    • String str = ""; 은 가능하다.
public class unicode {
    public static void main(String[] args){
        char c1 = 'A';      // 문자 직접 저장 -> A
        char c2 = 65;       // 10진수로 저장 -> A
        char c3 = '\u0041';     // 16진수로 저장 -> A

        char c4 = '가';      // 문자 직접 저장 -> 가 
        char c5 = 44032;        // 10진수로 저장 -> 가
        char c6 = '\uac00';     // 16진수로 저장 -> 가

        int uniCode = c1; 
        // 유니코드 얻기 -> 65
        // char 타입 변수를 int 타입 변수에 저장한다.

        System.out.println(c1);
        System.out.println(c2);
        System.out.println(c3);
        System.out.println(c4);
        System.out.println(c5);
        System.out.println(c6);
        System.out.println(uniCode);
    }
}

 

  • short 타입 
    • C 언어와의 호환을 위해 사용되며, 비교적 자바에서는 잘 사용되지 않는다.
  • int 타입 
    • byte, short 타입과 성능 차이는 거의 없기 때문에, 메모리가 크게 부족하지 않은 경우 int 타입을 사용한다.
    • 8진수 : '0' 
    • 16진수 : '0x'
    • 변수에 어떤 진수로 입력을 해도 2진수로 변환되어 저장된다.
  • long 타입 
    • 변수를 초기화할 때에는 정수값 뒤에 소문자 'l'이나 대문자 'L'을 붙일 수 있다.
    • 컴파일러에게 4byte가 아닌 8byte 정수 데이터를 알려주기 위한 목적
public class LongExample {
    public static void main(String[] args){
        long var1 = 10;
        long var2 = 20L;
        // long var3 = 10000000000000; 컴파일 에러
        long var4 = 10000000000000L;

        System.out.println(var1);
        System.out.println(var2);
        System.out.println(var4);
    }
}

 

  • 실수 타입(float, double)
    • 정수와 다르게 부동 소수점(floating-point) 방식으로 저장
    • 가수와 지수를 저장하기 위해 전체 bit를 나누어 사용
    • 가수 : 0 <= m < 1
    • 자바는 실수 리터럴의 기본 타입을 dobule으로 간주
    • float 타입으로 저장하려면 소문자 'f'나 대문자 'F'를 붙인다.

[부동 소수점 방식]
[실수형 타입의 bit 사용 방법]

 

  • 논리 타입(boolean)
    • 상태 값에 따라 조건문과 제어문의 실행 흐름을 변경하는데 주로 사용
    • true / false

 

타입 변환
  • 자동(묵시적) 타입 변환
    • 프로그램 실행 도중에 자동으로 타입 변환.
    • 작은 크기를 가지는 타입이 큰 크기를 가지는 타입에 저장될 때 발생
    • 단 하나의 예외로는, char 범위는 0~65535 이므로, 음수가 저장될 수 없기 때문에 음수 byte -> char 은 불가능
  • 강제(명시적) 타입 변환 = 캐스팅(Casting)
    • 큰 데이터 타입을 작은 데이터 타입으로 쪼개어서 저장하는 방법
    • 원래 int 값은 보존되지 않지만, int 값이 끝 1 byte 으로만 표현이 가능하다면, 값은 유지될 수 있다.
    • 자동 변환 되지 않는 경우
      1. int -> char 
      2. 실수(float, double) -> 정수(byte, short, int, long) : 소수점은 버려지고, 정수 부분만 저장
int intValue = 1030299770;
byte byteValue = (byte) intValue; // 강제 타입 변환(캐스팅)

[기본 타입 별 최대값, 최소값 상수]

 

  • 서로 다른 타입의 피연산자의 계산은 두 피연산자 중 크기가 큰 타입으로 자동 변환된 후 연산을 수행한다.

'프로그래밍 > JAVA' 카테고리의 다른 글

Ch06. 클래스  (0) 2022.01.02
Ch05. 참조 타입  (0) 2022.01.01
Ch04. 조건문과 반복문  (0) 2022.01.01
Ch03. 연산자  (0) 2022.01.01
Ch01. 자바 시작하기  (0) 2022.01.01

앞으로 자바 개념부터 정리해보려고 한다.

자료는 '이것이 자바다' 책을 기반으로 정리해보았다.  

 

프로그래밍 언어란?
  • 저급 언어 : 기계어, 어셈블리어
  • 고급 언어 : 프로그래밍 언어(C, C++, JAVA)
  • 컴파일 : 고급 언어를 컴퓨터가 이해할 수 있는 기게어로 변환하는 과정
  • 프로그램 : 컴퓨터에서 특정 목적을 수행하기 위해 프로그래밍 언어로 작성된 소스를 기계어로 번역한 것

 

자바란?
  • 1995~1999년 : 메모리 및 CPU를 지나치게 많이 사용하기 때문에 윈도우 프로그래밍 언어로는 부적합
  • 1999년 : 인터넷의 활성화로 웹 애플리케이션 구축용 언어로 자바의 급부상
  • 다양한 서버 운영 체제에서 단 한번의 작성으로 모든 곳에서 실행 가능한 언어였다.

 

자바의 특징
  • 이식성이 높은 언어 : JRE(Java Runtime Environment)가 설치되어 있는 모든 운영체제에서 실행 가능하다.
  • 객체 지향 언어 : 부품에 해당하는 객체를 먼저 만들고, 하나씩 조립 및 연결해서 전체 프로그램을 완성하는 기법을 OOP라고 한다. 자바는 객체를 고려하여 설계되었기 때문에 객체지향 언어가 가져야 하는 특징인 캡슐화, 상속, 다형성 기능을 완벽하게 지원한다.
  • 함수적 스타일 코딩 지원 : 대용량 데이터의 병렬 처리 그리고 이벤트 지향 프로그래밍을 위해 적합하다. 함수적 프로그래밍을 위해 람다식을 지원한다. 람다식은 컬렉션의 요소를 필터링, 매핑, 집계 처리하는데 쉬워지고, 코드가 매우 간결해진다.
  • 메모리를 자동 관리 : C++은 메모리에 생성된 객체를 제거하려면 개발자가 직접 코드를 작성. 자바는 개발자가 직접 메모리에 접근할 수 없도록 설계되었고, 메모리는 자바가 관리한다. 사용이 완료되면, Garbage Collector를 실행시켜 사용하지 않는 객체를 제거한다.
  • 다양한 애플리케이션을 개발 가능 : 자바는 다양한 운영체제에서 사용할 수 있는 개발 도구와 API를 묶어 에디션(Edition) 형태로 정의한다.
    • JAVA SE(Standard Edition)는 JVM를 비롯한 도구와 라이브러리 API를 정의한다. 
    • JAVA EE(Enterprise Edition)는 분산환경에서 서버용 애플리케이션(Servlet/JSP, EJB, Web Services)을 개발하기 위한 도구 및 라이브러리 API를 정의한다.
  • 멀티 스레드(Multi-Thread)를 쉽게 구현 : 하나의 프로그램이 동시에 여러 가지 작업을 처리해야 하는 경우와 대용량 작업을 빨리 처리하기 위해 서브 작업으로 분리해서 병렬 처리하려면 멀티 스레드 프로그래밍이 필요하다. 운영체제마다 멀티 스레드의 구현 방법이 다르지만, 자바는 관련 API를 이용해 멀티 스레드를 쉽게 구현할 수 있다.
  • 동적 로딩 지원(Dynamic Loading) 지원 :  애플리케이션이 실행될 때 모든 객체가 생성되지 않고, 객체가 필요한 시점에 클래스를 동적 로딩해서 객체를 생성한다. 따라서 유지보수가 쉽고 빠르다.
  • 오픈소스 라이브러리 풍부 : 자바는 오픈소스 언어이다. 검증된 오픈소스 라이브러리를 사용하면, 개발 기간의 단축과 안전성 확보가 가능하다.

 

자바 가상 기계(JVM)
  • 자바 프로그램은 중간 단계의 바이트 코드이기 때문에 이것을 해석하고 실행할 수 있는 가상의 운영체제가 필요하다. 이것을 JVM 이라고 한다. 
  • 운영체제마다 프로그램을 실행하고 관리하는 방법이 다르기 때문에 운영체제와 자바 프로그램을 중계하는 JVM을 두어 자바 프로그램이 여러 운영체제에서 동일한 실행 결과가 나오도록 설계한 것이다. 
  • 바이트 코드는 모든 JVM에서 동일한 실행 결과가 나오지만, JVM은 운영체제에 종속적이다.
  • JVM은 JDK 또는 JRE를 설치하면 자동으로 설치된다. 

[운영체제와 JVM 자바 프로그램의 실행 단계]

  1. .java 파일(소스 파일) 작성
  2. 소스 파일을 컴파일러로(javac.exe) 컴파일
  3. 확장자가 .class인 바이트 코드 생성
  4. 바이트 코드 파일은 JVM 구동 명령어(java.exe)에 의해 JVM에서 기계어로 해석되고 이 결과는 운영체제에 따라 달라진다.

 

자바 개발 도구 (JDK) 설치
  • JAVA SE(Standard Edition)의 구현체인 JDK를 먼저 설치해야 한다.
  • JAVA SE의 구현체는 JDK와 JRE 이라는 두 가지 버전이 있다.
    • JDK : 프로그램 개발에 필요한 JVM, 라이브러리 API, 컴파일러 등의 개발 도구 포함
    • JRE : 프로그램 실행에 필요한 JVM, 라이브러리 API 포함
  • JDK 내부의 bin 디렉토리는 컴파일러인 javac.exe와 JVM 구동 명령어인 java.exe를 포함
  • 이 명령어들을 다른 디렉토리에도 쉽게 실행할 수 있도록 Path 환경 변수에 bin 위치를 등록한다.

 

자바 프로그램 소스 작성부터 실행
  1. 소스 파일 생성(.java 텍스트 파일)
  2. 소스 파일을 컴파일러(javac.exe)로 컴파일
  3. 컴파일러로 바이트 코드(.class) 생성
  4. JVM 구동 명령어(java.exe)로 실행 // javac Hello.java -> Hello.class 파일 생성

[자바 프로그램 개발 순서 1]
[자바 프로그램 개발 순서 2]

 

프로그램 소스 분석
  • 클래스(class) 블록 : 필드 또는 메소드를 포함하는 블록
  • 메소드(method) 블록 : 어떤 일을 처리하는 실행문들을 모아 놓은 블록. 단독 작성 불가능. 클래스 블록 내부에 작성해야 한다.
    • main() 메소드 : 프로그램 실행 진입점(entry point)

 

추가 정리
  • 자바 소스 파일은 src 디렉토리에 저장
  • 바이트 코드 파일은 bin 디렉토리에 저장

 

 

'프로그래밍 > JAVA' 카테고리의 다른 글

Ch06. 클래스  (0) 2022.01.02
Ch05. 참조 타입  (0) 2022.01.01
Ch04. 조건문과 반복문  (0) 2022.01.01
Ch03. 연산자  (0) 2022.01.01
Ch02. 변수와 타입  (0) 2022.01.01

+ Recent posts