다형성(3)
·
자바/기본적인 개념
1. 매개변수의 다형성 ( 위와 같은 클래스들이 있다고 가정해보자. ) ( Product는 Tv, Computer, Audio의 조상이다. ) ( Buyer 클래스는 Tv, Computer, Audio를 구입하는 사람을 표현한 것이다. ) ( 그런 다음, 위와 같이 Buyer 클래스에 buy 메서드를 오버로딩을 해주었다. ) ( 하지만 제품의 종류가 늘어날 때마다 buy 메서드를 계속 오버로딩을 해주어야 된다. ) ( 그래서 위와 같이 매개변수에 다형성을 추가해주면 코드가 간결해진다. ) 2. 예제(1) - 매개변수에 다형성을 활용 3. 예제(2) - 매개변수에 다형성을 여러 종류의 객체 배열로 다루어 보기. ( 예제(1)과 Buyer 클래스와 main 클래스에서 수정이 되었다. ) ( 수정한 결과 Pr..
다형성(2)
·
자바/기본적인 개념
1. 예제(1) - 중복된 인스턴스 변수 ( 오버라이딩 된 메서드만 자손 인스턴스를 참조할 수 있지만, 중복된 인스턴스 변수는 자손 인스턴스에서 참조할 수 없다. ) 2. 예제(2) - 중복된 메서드와 인스턴스 변수 그리고 지역변수, this, super의 차이점 ( 인스턴스 변수를 이 예제처럼 직접 접근을 한다면, 참조 변수의 타입에 따라 사용되는 인스턴스 변수가 달라지므로, private로 접근을 제한하는 것이 좋다 .)
instanceof 연산자
·
자바/기본적인 개념
1. 사용 방법 - 주로 조건문에서 사용한다. - instanceof의 왼쪽에는 참조변수를 오른쪽에는 타입이 피연산자로 위치한다. - 결과값은 boolean 값인 true 또는 false가 반환된다. - 만약 값이 null인 참조변수에 대해 instanceof 연산을 수행하면 false를 결과로 얻는다. 2. 예제(1) - 업-다운 캐스팅 public class Exercise001 { public static void main(String[] args) { car c1 = new car(); car c2 = new sportCar(); sportCar c3 = new sportCar(); if(c1 instanceof car) { System.out.println("1"); } if(c1 instanc..
다형성(1)
·
자바/기본적인 개념
1. 객체지향에서의 다형성이란? (1) '여러 가지 형태를 가질 수 있는 능력'을 의미한다. (2) 자바에서는 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 한다. (3) 즉, 조상 클래스 타입의 참조변수로 자손 클래스의 인스턴스를 참조할 수 있도록 하였다. 2. 예제(1) - 다형성 구현해보기. ( 여기서 7번째 줄에서 주석으로 달린 것을 사용하면 에러가 발생한다. ) ( 그 이유는 인스턴스인 A의 멤버 개수보다 참조변수 b가 사용할 수 있는 멤버 개수가 많기 때문이다.) --> 자손 타입의 참조변수가 조상 타입의 인스턴스를 참조하는 것은 존재하지 않는 멤버를 사용하고자 할 가능성이 있기에 막아놓은 것이다. ( 예를 들자면, B b = new B()가 있다고 생각해보자. 그러면 b는 자신의..
제어자
·
자바/기본적인 개념
1. 제어자란 - 클래스, 변수 또는 메서드의 선언부에 함께 사용되어 부가적인 의미를 부여하는 것을 말한다. - 제어자의 종류는 접근 제어자와 그 외의 제어자로 나눌 수 있다. (1) 접근 제어자: public, protected, default, private (2) 그 외: static, final, abstract, native, transient, synchronized, volatile, strictfp 2. final - 클래스 앞에 붙으면: 변경될 수 없는 클래스, 확장될 수 없는 클래스가 된다. (*조상이 되지 못함) - 메서드 앞에 붙으면: 변경될 수 없는 메서드 또한 오버라이딩을 통해 재정의가 불가하다. (*오버로딩은 가능하다.) 3. 생성자를 이용한 final멤버 변수의 초기화 - 일..
import 문
·
자바/기본적인 개념
1. import 문이란? - 컴파일러에게 소스파일에 사용된 클래스의 패키지에 대한 정보를 제공하는 것을 말한다. - 이클립스에서 'ctrl + shift + o'를 누르면, 자동으로 import 문을 추가해준다. 2. java.lang.*; - import 선언할 때 사용되는 문장이다. - System과 String 같은 클래스들이 있는 패키지인데, 선언 없이 사용할 수 있었던 것은 매우 빈번히 사용되는 중요한 클래스이기 때문에 따로 지정하지 않았던 것이다. 3. static import - static 멤버를 호출할 때 클래스 이름을 생략할 수 있다. - 특정 클래스의 static 멤버를 자주 사용할 때 편리하고, 코드가 간결해진다. 4. 예제 - static import 활용해보기. ( 앞에 Sys..
패키지
·
자바/기본적인 개념
1. 패키지란? - 패키지에는 클래스 또는 인터페이스를 포함시킬 수 있으며, 서로 관련된 클래스들끼리 그룹 단위로 묶어 놓음으로써 클래스를 효율적으로 관리할 수 있다. - 같은 이름의 클래스 일지라도 서로 다른 패키지에 존재하는 것이 가능하므로, 이름이 충돌하는 것을 피할 수 있다. 2. 패키지의 규칙 (1) 하나의 소스 파일에는 첫 번째 문장으로 단 한 번의 패키지 선언만을 허용한다. (*첫 번째 문장은 반드시 주석과 공백을 제외한 곳이여야 한다.) (2) 모든 클래스는 반드시 하나의 패키지에 속해야 한다. (3) 패키지는 점(.)을 구분자로 하여 계층 구조를 구성할 수 있다. (4) 패키지는 물리적으로 클래스 파일(.class)을 포함하는 하나의 디렉토리이다. (5) 이름은 대소문자로 이용하지만, 소..
super
·
자바/기본적인 개념
1. super란? (1) 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조 변수이다. (2) 멤버 변수와 지역 변수가 이름이 같을 때 this를 사용하는 것처럼, super 또한 조상 클래스에서의 멤버 변수와 자손 클래스의 멤버 변수와 이름이 같을 때 사용된다. (3) 모든 인스턴스 메서드에는 자신이 속한 인스턴스의 주소가 지역 변수로 저장되는데, 이것이 참조변수 this와 super의 값이 된다. (4) this와 마찬가지로 super는 static 메서드에서 사용할 수 없다. 즉, 인스턴스 메서드에서만 사용이 가능하다. 2. super() (1) this()와 마찬가지로 super() 역시 생성자이다. (2) this()는 자신의 클래스에서 다른 생성자를 부르지만, supe..
오버라이딩
·
자바/기본적인 개념
1. 오버라이딩이란? - 조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것을 말한다. - override는 사전적 의미로 '~위에 덮어쓰다'로 해석된다. 2. 오버라이딩 조건 (1) 조상 클래스의 메소드와 이름이 같아야 한다. (2) 조상 클래스의 메소드와 매개변수가 같아야 한다. (3) 조상 클래스의 메소드와 반환타입이 같아야 한다. (4) 조상 클래스의 메소드의 접근 제어자의 범위보다 같거나 커야 한다. ( *접근 제어자 범위 순서: public > protected > (default) > private ) (5) 조상 클래스의 메서드의 예외의 수보다 같거나 적어야 한다. (6) 조상의 인스턴스 메서드를 자손에서 static 메서드로 또는 그 반대로 변경할 수 없다. Q) 만약 조상 stati..
상속
·
자바/기본적인 개념
1. 상속을 씀으로써 얻을 수 있는 기대효과 (1) 코드의 재사용성을 높이고 코드의 중복성을 제거할 수 있다. (2) 프로그램의 생산성과 유지보수에 크게 기여된다. 2. 부모와 아이 - 부모는 조상, 상위, 기반 클래스라고도 불리어진다. - 아이는 자손, 하위, 파생된 클래스라고도 불리어진다. ( age는 부모에서 생성된 age이다. ) ( 이처럼 age는 아이에게 포함되므로 부모에서 정의한 것을 같이 사용할 수 있다. ) 3. 상속될 때 규칙 (1) 생성자와 초기화 블럭은 상속되지 않는다. 맴버만 상속될 수 있다. (2) 항상 상위 클래스보다 하위클래스는 같거나 많은 맴버를 갖는다. 4. 간접적인 상속 관계 ( GrandChild와 Parent 관계가 있을 때, 우리는 간접적인 상속 관계라고 부른다. ..
초기화 블럭
·
자바/기본적인 개념
1. 클래스 초기화 블럭 - 클래스 변수의 복잡한 초기화에 사용된다. - 보통 "static { ... }" 형식으로 사용된다. - 클래스 초기화 블럭은 클래스가 메모리에 처음 로딩될 때 한번만 수행된다. - 앞서 배운 내용이지만, 클래스 초기화이므로 인스턴스 변수를 초기화하지 못한다. 2. 인스턴스 초기화 블럭 - 인스턴스 변수의 복잡한 초기화에 사용된다. - 보통 "{ ... }" 형식으로 사용된다. - 인스턴스 초기화 블럭은 생성자와 같이 인스턴스를 생성할 때 마다 수행된다. - 인스턴스 변수의 초기화는 주로 생성자를 사용하고, 인스턴스 초기화 블럭은 모든 생성자에서 공통으로 수행돼야 하는 코드를 넣는데 사용한다. - 아래의 예제를 통해 이해하자. ( 위 예제에서 두 생성자는 "this.x++"을 ..
생성자
·
자바/기본적인 개념
1. 하나의 클래스의 인스턴스가 생성되는 코드의 단계 (1) 연산자 new에 의해서 메모리(heap)에 클래스의 인스턴스가 생성된다. (2) 생성자가 호출되어 수행된다. (3) 연산자 new의 결과로, 생성된 클래스의 인스턴스의 주소가 반환되어 참조변수에 저장된다. ( 주의할 점은 연산자 new가 인스턴스를 생성하는 것이지 생성자가 인스턴스를 생성하는 것이 아니다. ) 2. 생성자에서 다른 생성자 호출하기 - this(), this - this는 참조변수로 인스턴스 자신을 가리킨다. - 사실 생성자를 포함한 모든 인스턴스 메서드에는 자신이 관련된 인스턴스를 가리키는 참조변수 'this'가 지역변수로 숨겨진 채로 존재한다. - 같은 클래스의 멤버들 간에 서로 호출할 수 있는 것처럼 생성자 간에도 서로 호출..
가변 인자(varargs)
·
자바/기본적인 개념
1. 가변 인자 (1) 아래와 같은 "타입... 변수명"과 같은 형식으로 선언하며, PrintStream 클래스의 printf()가 대표적인 예이다. public PrintStream printf(String format, Object... args) { ... } (2) 가변 인자 외에도 더 추가할 매개변수가 있다고 한다면, 맨 뒤에 가변 인자를 두어야 한다. (3) 아래의 함수와 같이 앞에 가변인자를 두게 되면 컴파일 에러가 발생한다. public PrintStream printf(Object... args, String format) { ... } 2. 예제 - 가변 인자를 활용하여 오버로딩 구현 ( 위 예제는 오버로딩을 구현했는데, 계속 해서 매개변수를 String으로 늘린다면, 차라리 Strin..
오버 로딩
·
자바/기본적인 개념
1. 오버 로딩 - 한 클래스 내에서 같은 이름을 가진 2개 이상의 메서드를 아래의 조건이 만족한다면, 정의할 수 있다. (1) 메서드 이름이 같아야 한다. ( 단, 반환 타입은 달라도 괜찮다. ) (2) 매개변수의 개수 또는 매개변수의 타입이 달라야 한다. ( 또는 이라는 말은 둘 중 하나의 조건만 맞다면, 오버로딩을 적용할 수 있다는 것이다. ) 2. 잘못된 예제(1) ( 매개변수의 이름이 다르더라도 갯수가 똑같기 때문에 에러가 발생한다. ) 3. 잘못된 예제(2) ( 위의 반환 타입 int와 long은 오버 로딩에 아무런 영향을 주지 않기 때문에, 오버 로딩을 할 때 오직 매개변수에만 고려해야 한다. ) 4. 올바른 예제(1) ( 이렇게 매개변수에 개수를 다르게 함으로써 오버로딩을 가능케 한다. )..
클래스 맴버와 인스턴스 맴버간의 참조와 호출
·
자바/기본적인 개념
# 같은 클래스에 속한 맴버들 간에는 별도의 인스턴스를 생성하지 않고도 서로 참조 또는 호출이 가능하다. # 단, 클래스 맴버가 인스턴스 맴버를 참조 또는 호출하고자 하는 경우에는 인스턴스를 생성해야 한다. -> 그 이유는 인스턴스 맴버가 존재하는 시점에는 클래스 맴버는 항상 존재하지만, 클래스 맴버가 존재하는 시점에 인스턴스 맴버가 존재하지 않을 수 있기 때문에 컴파일러가 에러를 발생하게 한다. 1. 예제 - 클래스 변수가 인스턴스 변수를 참조할 때 에러발생 int a; static int b = a; 에러 발생 // 에러발생 static int b = new Exercise001().a; // 컴파일 가능 2. 예제 - 참조변수를 사용하지 않고 인스턴스 메서드 참조하기.
클래스 메서드(static 메서드)와 인스턴스 메서드
·
자바/기본적인 개념
1. 클래스 메서드(static 메서드) (1) 인스턴스와 관계없는 메서드를 클래스 메서드이다. ( 인스턴스 멤버는 객체 생성시 메모리에 올라가지만 클래스 멤버는 클래스와 동시에 로딩된다. ) (2) 인스턴스를 사용하지 않는다고 해서 반드시 클래스 메서드를 정의하는 것은 아니지만, 특별한 이유가 없는 한 그렇게 하는 것이 일반적이다. 2. 인스턴스 메서드 - 인스턴스 변수와 관련된 작업을 하며, 메서드의 작업을 수행하는데 인스턴스 변수를 필요로 하는 메서드 이다. 3. 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려해본다. - 그 이유는 메서드 호출 시간이 짧아지므로 성능이 향상된다. 4. 이름이 동일한 클래스 메서드와 인스턴스 메서드를 동시에 사용하면? ( 에러가 발생..
기본형 매개변수와 참조형 매개변수
·
자바/기본적인 개념
1. 기본형 매개변수 - 변수의 값만 읽기만 할 수 있다. 그 이유는 단순히 값만 전달 받기 때문이다. 2. 참조형 매개변수 - 변수의 값을 읽고 변경할 수 있다. 그 이유는 저장되는 곳의 주소를 전달 받기 때문이다. 3. 배열을 이용한 참조형 매개변수 4. 참조형 반환타입 ( 인스턴스화를 하지 않아서 클래스 변수를 사용할 수 없다. ) ( 그래서 new를 해주는데 메소드를 통해서 받아보자. )
JVM의 메모리 구조
·
자바/기본적인 개념
# 응용 프로그램이 실행되면, JVM은 시스템으로부터 프로그램을 수행하는데 필요한 메모리를 할당받고 JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다. 그 중 3가지 영역에 대해서 알아보자. 1. 메서드 영역 - 프로그램 실행 중 어떤 클래스가 사용되면, JVM은 해당 클래스의 클래스 파일을 읽어서 분석하여 클래스에 대한 정보(클래스 데이터)를 이곳에 저장한다. - 이 때, 그 클래스의 클래스 변수(CV)도 이 영역에 함께 생성된다. 2. Call Stack - 호출 스택은 메서드의 작업에 필요한 메모리 공간을 제공한다. - 메서드가 호출되면 호출 스택에 호출된 메서드를 위한 메모리가 할당되며, 이 메모리는 메서드가 작업을 수행하는 동안 지역 변수(매개변수 포함)들과 연산의 중간결과 등을 ..
메서드
·
자바/기본적인 개념
1. 메서드의 호출 - 같은 클래스 내의 메서드끼리는 참조변수를 사용하지 않고도 서로 호출이 가능하지만, static 메서드는 같은 클래스 내의 인스턴스 메서드를 호출할 수 없다. ( 그 대신 static 메서드끼리는 호출이 가능하다. ) 2. return문 - 반환 타입이 void인 경우, 컴파일러가 마지막 부분에 "return ;"을 자동으로 넣어준다.
객체 배열
·
자바/기본적인 개념
# 객체 배열은 일반 배열과 같이 선언하는 것은 동일하다. 그러나 아주 중요한 차이점이 있다. 그것은 바로 선언한 후, 바로 객체가 생성되지 않는다는 점이다. 즉, 객체를 다루기 위한 참조 변수들이 만들어진 것일 뿐, 아직 객체가 저장되지 않았다. 그래서 무조건 배열을 만들었다고 객체가 저장된 것이 아니라는 점을 주의하자. 1. 객체 배열 선언 for문을 통해서 선언해보기. 2. 비객체지향적 코드 vs 객체지향적 코드 - 비객체지향적 코드는 보통 아래와 같은 코드들이다. - 객체지향적 코드는 아래와 같은 코드들이다.
가변 배열
·
자바/기본적인 개념
# 2차원 이상의 다차원 배열을 전체 배열 차수 중 마지막 차수의 길이를 지정하지 않고, 추후에 각기 다른 길이의 배열을 생성함으로써 고정된 형태가 아닌 유동적인 가변 배열을 구성할 수 있다. # 가변 배열 역시 중괄호를 이용해서 아래의 그림처럼 구현할 수 있다.
다차원 배열
·
자바/기본적인 개념
1. 2차원 배열의 초기화 2. 2차원 배열에서의 length? - 2차원 배열 변수가 참조하고 있는 곳이 행이기에, 행의 갯수가 나오게 된다. (ex: arr.length) - 열의 갯수는 해당 행의 길이를 가지고 쓰면 된다. (ex: arr[0].length) 3. 2차원 배열의 길이를 이용하여 초기화하는 방법 4. 2차원 배열들을 향상된 for문을 통해서 합계 구하기. 5. 예제(1) - 좌표에 X 표하기. import java.util.Scanner; public class Exercise001 { public static void main(String[] args) { final int SIZE = 10; int x = 0, y = 0; char[][] board = new char[SIZE][..
커맨드 라인을 통해 입력받기
·
자바/기본적인 개념
# Scanner 클래스의 nextLine()외에도 화면을 통해 사용자로부터 값을 입력받을 수 있는 간단한 방법이 있다. 바로 커맨드라인을 이용하는 방법인데, 프로그램을 실행할 때 클래스 이름 뒤에 공백 문자로 구분하여 여러 개의 문자열을 프로그램에 전달할 수 있다. # 사용 방법은 일단 java 파일의 경로를 알아야 한다. 예를 들어, 경로는 jdk.18\work\ch5 라고 해보자. 그러면 커멘드 라인을 켜서, 해당하는 폴더로 이동해보자. 그런 다음, "java [클래스 이름] [String[] args 입력 받는 곳]" 형식에 맞게 입력하면 된다. 만약 배열의 요소가 3개라고 한다면, "10 + 3" 식으로 args 변수에게 입력한다.
String 배열
·
자바/기본적인 개념
1. String 배열은 객체의 주소가 있는 참조형 배열이다? - String 배열은 아래의 그림처럼 저장이 됩니다. 그 이유는 String은 클래스이기 때문에, 객체로 인식하게 됩니다. (이처럼 기본형 배열이 아닌 참조형 배열이 됩니다.) 2. 예제(1) - 16진수에서 2진수로 변환해보기. 3. char 배열 vs String 클래스 - 자바에서는 문자열을 처리할 때, String 배열을 쓴다. 그 이유는 String 클래스가 char 배열에 여러 가지 기능을 추가 하여 확장한 것이기 때문이다. - c언어에서는 char 배열을 다룰지라도, 자바에서는 char 배열과 그에 관련된 기능들을 함께 묶어서 String 클래스를 정의한다. - 그러나 char 배열과 String 클래스의 한 가지 중요한 차이가..
배열
·
자바/기본적인 개념
1. 배열의 길이 - (배열 이름).length - 생성될 때 배열의 길이는 length라는 상수에 저장이 된다. 그래서 값은 변하지 않는다. 2. 배열 선언을 더욱 간단하게 정의하기. - int[] score = new int[]{1,2,3,4,5} - int[] score = {1,2,3,4,5}; 3. 배열 요소들을 더욱 간단하게 출력하기. - Arrays.toString() 함수를 이용한다. - 사용방법은 배열 이름을 함수 () 안에 넣어준다. 4. 배열 이름을 출력해보면? - 일반적으로 배열의 주소가 나올 것인데, "타입@주소"의 형식으로 나오게 될 것이다. - 예를 들면 int 배열이 있다고 한다면, "I@16진수주소"의 형식으로 나온다. 5. Char 배열을 간단하게 출력해보기. - 굳이 A..
반복문
·
자바/기본적인 개념
1. 초기화와 증감식 - 조건식을 제외하고 초기화와 증감식은 둘 이상의 식을 쓸 수 있다. 2. 빈 문장 - for 문에는 세 가지 요소를 생략하고 빈칸을 만들어 낼 수 있다. - 이때, '참'으로 간주되어 무한 반복문이 되어버린다 3. 향상된 for 문 - JDK 1.5부터 배열과 컬렉션에 저장된 요소에 접근할 때 기존보다 편리한 방법으로 처리할 수 있도록 for문에 새로운 문법을 추가하였다. 4. 이름 붙은 반복문 - break 문을 사용하여 반복문을 나가지만, 중첩된 반복문이라면 break 문 하나로 나가기 힘들 것이다. - 그래서 등장한 것이 반복문 앞에 이름 붙이는 문법이다. - 사용 방법은 for 또는 while 앞에 이름을 붙여주고 : 로 구분한다. 5. 예제(1) - for 문 앞 세미클론..
Math.random
·
자바/기본적인 개념
Math 클래스의 메소드 random은 난수(임의의 수)를 얻기 위해서 사용되어진다. 이 메소드는 0.0과 1.0 사이의 범위에 속하는 하나의 double 값을 반환한다. (*0.0은 포함하고, 1.0은 포함되지 않는다.) 만약 1~3 사이의 값을 얻고 싶다면, 아래처럼 코드를 짜면 될 것이다.
Switch
·
자바/기본적인 개념
1. 제약 조건 - switch 문의 제약 조건은 항상 정수이거나 문자 또는 문자열이여야 한다. - 또한 case문 또한 조건식과 항상 똑같은 타입이여야 된다. 2. 문법 - case 문을 여러 개 붙여서 쓰고 싶다면, "case 4: case 5: " 식으로 사용한다. 3. if vs switch - 성능 속도 부분에서 switch를 써야하지만, 만약 복잡한 조건식이 나온다면, 가독성 부분에서도 고민해보아야 한다. 4. 예시 - 만약 0~100점의 성적 점수가 있는데, 90~100까지 A, 80~89까지 B라고 하고 case문으로 받아주는 것보다 if를 쓰는 것이 간결하다. 그러나 성능을 생각한다면 case문이 나을 수 있다. Q) 그렇다면 어떻게 하는 것이 case문을 더 간결하게 사용할 수 있을까?..
등가 비교 연산
·
자바/기본적인 개념
- 예제(1): 실수형 비교 ( 10.0 == 10.0f는 true가 되고 0.1 == 0.1f false가 되는 것일까? ) ( 그 이유는 0.1은 double로 인식하기 때문이다. ) (왜냐하면 실수형은 근사값이 저장되기 때문에 오차가 발생하게 된다.) ( 단, 정수형 부분은 근사값이 저장되지 않으므로, 오차가 발생하지 않는다. ) - 예제(2): 문자형 비교 ( a 변수와 "abc" 비교는 true이지만, b와 "abc" 비교는 false이다. ) ( 그 이유는 b와 "abc"는 서로 다른 객체이기 때문이다. ) ( 그렇다면 true 되도록 할려면 어떻게 해야 할까? ) -> equals()를 사용한다. - 예제(3): 하나의 문자를 입력을 받는데 스트링으로 받아서 하나의 char로 가져오기.
산술 연산자(2)
·
자바/기본적인 개념
- 예제(1) (이 예제를 보면, 당연히 제대로 된 값이 나와야 된다.) (그러나 마이너스 값이 나오게 되었다. 그러한 이유는 int * int = int가 나오기 때문이다.) (즉, int는 2x10^9까지만 저장이 되지만, 위의 결과 값은 오버플로우가 되어버린다.) (그래서 우리는 a나 b 앞에 L이나 (long)을 명시적으로 적어줘야 한다.) - 예제(2) (이 예제는 연산 순서에 의미가 있다.) (즉, 먼저 연산하는 곱하기 또는 나누기에 따라 int 범위에 넘어가는지 안 넘어가는지 체크를 해야한다.) - 예제(3) (이 예제에서는 char도 연산을 수행할 때, 정수형 값이 나오게 된다.) (대신 b-a를 통해 char를 얻을려면 형변환을 명시적으로 해주어야 한다.) (또한 아래의 예제(4)의 변수..