• 검색 결과가 없습니다.

29 4. 자료형 (Data Type)

N/A
N/A
Protected

Academic year: 2022

Share "29 4. 자료형 (Data Type)"

Copied!
35
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

4. 자료형 (Data Type)

기본형 자료형 (Primitive Data Type)

 byte

⬧ byte 데이터 유형은 8 비트 부호 있는 2 의 보수 정수입니다

⬧ 최소값은 -128 (-2 ^ 7)입니다.

⬧ 최대 값은 127 (2 ^ 7 -1 포함)입니다.

⬧ 기본값은 0 입니다.

⬧ Byte 데이터 형식은 주로 정수 대신에 큰 배열의 공간을 절약하는 데 사용됩니다.

바이트는 int 보다 4 배 작기 때문입니다.

⬧ 예 : byte a = 100, byte b = -50

 short

⬧ short 데이터 형식은 16 비트 부호 있는 2 의 보수 정수입니다.

⬧ 최소값은 -32,768 (-2 ^ 15)입니다.

⬧ 최대 값은 32,767 (포함) (2 ^ 15 -1)입니다.

⬧ short 데이터 형식을 사용하여 메모리를 바이트 데이터 형식으로 저장할 수도 있습니다. short 는 int 보다 2 배 작습니다.

⬧ 기본값은 0 입니다.

⬧ 예 : short s = 10000, short r = -20000

 int

⬧ Int 데이터 형식은 32 비트 부호 있는 2 의 보수 정수입니다.

⬧ 최소값은 2,147,483,648 (-2 ^ 31)입니다.

⬧ 최대 값은 2,147,483,647 (2 ^ 31 -1)입니다.

⬧ 정수는 일반적으로 메모리에 대한 염려가 없으면 정수 값의 기본 데이터 형식으로 사용됩니다.

(2)

⬧ 기본값은 0 입니다.

⬧ 예 : int a = 100000, int b = -200000

 long

⬧ long 데이터 형식은 64 비트 부호있는 2 의 보수 정수입니다.

⬧ 최소값은 -9,223,372,036,854,775,808 (-2 ^ 63)입니다.

⬧ 최대 값은 9,223,372,036,854,775,807 (포함) (2 ^ 63 -1)입니다.

⬧ 이 타입은 int 보다 넓은 범위가 필요할 때 사용됩니다.

⬧ 기본값은 0L 입니다.

⬧ 예 : long a = 100000L, long b = -200000L

 float

⬧ Float 데이터 유형은 단일 정밀 32 비트 IEEE 754 부동 소수점입니다.

⬧ Float 는 주로 부동소수점의 대형 배열에서 메모리를 저장하는 데 사용됩니다.

⬧ 기본값은 0.0f 입니다.

⬧ 예 : float f1 = 234.5f

 double

⬧ double 데이터 형식은 이중 정밀 64 비트 IEEE 754 부동 소수점 형식입니다.

⬧ 이 데이터 유형은 일반적으로 10 진수 값의 기본 데이터 유형으로 사용되며 일반적으로 기본 선택 사항입니다.

⬧ 기본값은 0.0d 입니다.

⬧ 예 : double d1 = 123.4

 boolean

⬧ boolean 데이터 유형은 1 비트의 정보를 나타냅니다.

⬧ 가능한 값은 true 와 false 입니다.

⬧ 이 데이터 유형은 참 / 거짓 조건을 추적하는 단순 플래그에 사용됩니다

(3)

⬧ 기본값은 false 입니다.

⬧ 예 : Boolean one = true

 Char

⬧ char 데이터 형식은 단일 16 비트 유니코드 문자입니다.

⬧ 최소값은 '\ u0000'(또는 0)입니다.

⬧ 최대 값은 '\ uffff'(또는 65535 포함)입니다.

⬧ Char 데이터 형식은 모든 문자를 저장하는 데 사용됩니다.

⬧ 예 : char letterA = 'A'

자바 문자 상수

자바 문자 상수는 고정 값을 나타내는 소스 코드 표현입니다. 그리고 계산없이 코드에서 직접 표현됩니다. 문자 상수는 모든 기본 유형 변수에 할당될 수 있습니다. 예를 들어

byte a = 20;

char b = 'B';

byte, int, long 으로 decimal (10 진수), hexadecimal (16 진수) 또는 octal (8 진수) 로 표시할 수 있습니다.

접두사 0 은 8 진수를 나타내는 데 사용되고 0x 는 문자 상수에 대해 이 숫자 시스템을 사용 할 때 16 진수를 나타냅니다. 예를 들어 다음과 같이 입력하게 되면 아래와 같이 출력하게 됩니다.

int decimal = 100;

int octal = 0144;

int hexa = 0x64;

System.out.println("2 진수" + decimal);

System.out.println("8 진수" + octal);

System.out.println("16 진수" + hexa);

결과 2 진수 100 8 진수 100 16 진수 100

(4)

특수문자 Escape 시퀀스

Escape 시퀀스 설명

\t 텍스트에 tab 을 삽입합니다.

\b 텍스트에 백 스페이스를 삽입합니다

\n 텍스트에 줄 바꿈을 삽입합니다.

\r 텍스트에 캐리지 리턴을 삽입합니다.

\f 텍스트에 form feed 를 삽입합니다

\’ 작은 따옴표를 텍스트에 삽입합니다.

\” 큰 따옴표를 텍스트에 삽입합니다.

\\ 백 슬래시를 텍스트에 삽입합니다.

Java 변수

 로컬 변수 (Local Variable)

⬧ 로컬 변수는 메소드, 생성자 또는 블록에서 선언됩니다.

⬧ 메서드, 생성자 또는 블록을 입력하면 로컬 변수가 만들어지고 변수가 메서드, 생성자 또는 블록을 벗어나면 변수가 삭제됩니다.

⬧ Access modifier 는 로컬 변수에 사용할 수 없습니다.

⬧ 로컬 변수는 선언된 메소드, 생성자 또는 블록 내에서만 볼 수 있습니다.

⬧ 로컬 변수는 스택 레벨에서 내부적으로 구현됩니다.

⬧ 로컬 변수에는 기본값이 없으므로 로컬 변수를 선언하고 처음 사용하기 전에 초기 값을 지정해야 합니다.

예제)

여기에서 age 는 로컬 변수입니다. 이것은 catAge() 메소드 내에서 정의되며 해당 범위는 이 메소드로만 제한됩니다.

public void catAge() { int age;

age = age + 3;

System.out.println("고양이의 나이는 : " + age);

(5)

}

public static void main(String args[]) { Myjava test = new Myjava();

test.catAge();

}

그러면 다음과 같은 결과가 출력됩니다.

고양이의 나이는 : 3

다음 예제에서는 초기화하지 않고 age 를 사용하므로 컴파일 할 때 오류가 발생합니다.

public void catAge() { int age;

age = age + 3;

System.out.println("고양이의 나이는 : " + age);

}

public static void main(String args[]) { Myjava test = new Myjava();

test.catAge();

}

컴파일하는 동안 다음과 같은 오류가 발생합니다.

Exception in thread "main" java.lang.Error: Unresolved compilation problem:

The local variable age may not have been initialized

at test.Myjava.catAge(Myjava.java:7) at test.Myjava.main(Myjava.java:13)

 인스턴스 변수 (Instance Variables)

⬧ 인스턴스 변수는 클래스에서 선언되지만 메소드, 생성자 또는 블록 외부에서 선언됩니다.

⬧ 힙 영역에 객체에 대한 공간이 할당되면 각 인스턴스 변수 값에 대한 슬롯이 작성됩니다.

⬧ 인스턴스 변수는 'new'라는 키워드를 사용하여 객체를 생성할 때 만들어지며 객체가 소멸될 때 파괴됩니다.

⬧ 인스턴스 변수는 둘 이상의 메소드, 생성자 또는 블록 또는 클래스 전반에 걸쳐 존재하는 객체의 필수 부분에 의해 참조 되어야 하는 값을 보유합니다.

⬧ 인스턴스 변수는 사용 전후에 클래스 수준에서 선언할 수 있습니다.

(6)

⬧ 인스턴스 변수에 대한 Access modifiers 를 지정할 수 있습니다.

⬧ 인스턴스 변수는 클래스의 모든 메소드, 생성자 및 블록에서 볼 수 있습니다. 일반적으로 이러한 변수를 private 로 설정하는 것이 좋습니다 (액세스 수준). 그러나 Access modifier 를 사용하여 이 변수에 대해 서브 클래스에 대한 가시성을 제공할 수 있습니다.

⬧ 인스턴스 변수에는 기본값이 있습니다. 숫자의 경우 기본값은 0 이고 부울 값은 false 이며 객체 참조의 경우 null 입니다. 값들은 선언 중에 또는 생성자 내에서 할당할 수 있습니다.

⬧ 인스턴스 변수는 클래스 내부에서 변수 이름을 호출하여 직접 액세스 할 수 있습니다. 그러나 정적 메소드 (인스턴스 변수에 접근성이 부여된 경우)에는 완전한 이름을 사용하여 호출해야 합니다.

예제)

public class Staff {

// 이 인스턴스 변수는 모든 하위 클래스에 대해 볼 수 있습니다.

public String name;

// 급여 변수는 Staff 클래스에서만 볼 수 있습니다.

private double salary;

// name 변수는 생성자에 할당됩니다.

public Staff (String stfName) { name = stfName;

}

// 급여 변수에 값이 할당됩니다.

public void setSalary(double stfSal) { salary = stfSal;

}

// 이 메소드는 Staff 세부사항을 출력합니다.

public void printstf() {

System.out.println("이름 : " + name );

System.out.println("급여 : " + salary);

}

public static void main(String args[]) { Staff stfOne = new Staff("김민준");

stfOne.setSalary(1000);

stfOne.printstf();

} }

(7)

결과

이름 : 김민준 급여 : 1000.0

 클래스/정적 변수 (Class/Static Variable)

⬧ 정적 변수라고도 하는 클래스 변수는 클래스에서 정적 키워드로 선언되지만 메소드, 생성자 또는 블록 외부에서도 또한 선언됩니다.

⬧ 클래스에서 생성되는 객체 수에 관계없이 클래스 당 각 클래스 변수의 복사본은 하나뿐입니다.

⬧ 정적 변수는 상수로 선언되는 것 외에는 거의 사용되지 않습니다. 상수는 public / private, final 및 static 으로 선언 된 변수입니다. 상수 변수는 초기 값에서 절대로 변하지 않습니다.

⬧ 정적 변수는 정적 메모리에 저장됩니다. 선언된 final 이외의 정적 변수를 사용하는 것은 드물지만 public 또는 private 상수로 사용됩니다.

⬧ 정적 변수는 프로그램이 시작될 때 만들어지며 프로그램이 멈추면 없어집니다.

⬧ 가시성은 인스턴스 변수와 유사합니다. 그러나 대부분의 정적 변수는 클래스 사용자가 사용할 수 있어야 하므로 공용으로 선언됩니다.

⬧ 기본값은 인스턴스 변수와 동일합니다. 숫자의 경우 기본값은 0 입니다. 부울의 경우 거짓입니다. 객체 참조의 경우 null 입니다. 값들은 선언 중에 또는 생성자 내에서 할당할 수 있습니다. 또한 특수 static initializer 블록에 값을 할당할 수 있습니다.

⬧ 정적 변수는 ClassName.VariableName이라는 클래스 이름으로 호출하여 액세스 할 수 있습니다.

⬧ 클래스 변수를 public static final 로 선언할 때 변수 이름 (상수)은 모두 대문자입니다. 정적 변수가 public 및 final 이 아닌 경우 명명 구문은 인스턴스 및 로컬 변수와 동일합니다.

예제)

public class Staff {

// 급여 변수는 private 정적 변수입니다.

private static double salary;

(8)

// DEPARTMENT 는 상수입니다.

public static final String DEPARTMENT = "영업부 ";

public static void main(String args[]) { salary = 1000;

System.out.println(DEPARTMENT + "평균급여:" + salary);

} }

그러면 다음 결과가 출력됩니다.

영업부 평균급여:1000.0

접근 제한자 (Access Modifier)

Java 는 클래스, 변수, 메소드 및 생성자에 대한 접근 레벨을 설정하는 private, public, protected 와 같은 접근 제한자를 제공합니다.

 Default

패키지에 표시되며 기본값입니다. 제한자가 필요하지 않습니다.

기본 접근 제한자는 클래스, 필드, 메소드 등에 대한 대한 접근 제한자를 명시적으로 선언 하지 않음을 의미합니다.

변수 및 메소드는 다음 예제와 같이 제한자없이 선언할 수 있습니다.

String patch = "1.15.0";

boolean coffeeOrder() { return true;

}

 Private

private 으로 선언된 메소드, 변수 및 생성자는 선언된 클래스 자체 내에서만 액세스 할 수 있습니다.

다음 클래스는 private 접근 제한자를 이용합니다.

public class market {

private String category;

public String getCategpry() {

(9)

return this.category;

}

public void setCategory(String category) { this.category = category;

} }

여기서 market 클래스는 private 이므로 다른 클래스가 그 값을 직접 검색하거나 설정할 수 있는 방법이 없습니다.

그래서 이 변수를 외부에 이용 가능하게 하기 위해 형식 값을 반환하는 getCategory(), 와 그 값을 설정하는 setCategory(String) 의 두가지 public 메소드를 정의했습니다.

 Public

public 으로 선언된 클래스, 메소드. 생성자, 인터페이스 등은 다른 클래스에서 접근할 수 있습니다. 따라서 public 클래스 내에서 선언된 필드, 메소드, 블록은 모든 클래스에서 접 근할 수 있습니다.

다음 예제는 public 접근 제한자를 이용합니다.

public static void main(String []args) {

System.out.println("첫 번째 자바프로그램입니다.");

}

응용 프로그램의 main() 메소드는 public 이어야 합니다. 그렇지 않으면 Java 인터프리터 가 클래스에서 실행되도록 부를 수 없습니다.

 Protected

Protected 로 선언된 멤버 필드와 메소드는 같은 패키지 내에 있는 클래스들은 모두 접근 가능하다. 다른 패키지에 있는 클래스들은 이 클래스로부터 상속받은 경우에만 접근 가능 하다.

다음 상위 클래스는 protected 접근 제한자를 사용하여 하위 클래스가 searchWifi() 메 소드를 대체하도록 허용합니다.

class Hotel {

protected boolean searchWifi(Wifi wi) { // 상세 내용

} }

(10)

class HotelInternet {

boolean searchWifi(Wifi wi) { // 상세 내용

} }

여기서 searchWifi() 메소드를 private 으로 정의한다면 Hotel 이외의 다른 클래스에서는 접근할 수 없습니다. 하지만 public 으로 정의한다면, 모든 클래스에서 접근할 수 있게 될 것입니다. 따라서 protected 접근 제한자를 사용하여 이 메소드를 서브 클래스에만 노출 시킵니다.

변수 수식자 (Non Access Modifier)

Java 는 다른 많은 기능을 구현하기 위해 다음과 같은 변수 수식자를 제공합니다.

 static

static 키워드는 클래스에 대해 생성된 인스턴스와 독립적으로 존재할 메소드를 작성하는 데 사용됩니다.

다음 예제와 같이 클래스 메소드와 변수를 작성하는 데 사용됩니다.

public class InstanceCounter {

private static int numInstances = 0;

protected static int getCount() { return numInstances;

}

private static void addInstance() { numInstances++;

}

InstanceCounter() {

InstanceCounter.addInstance();

}

public static void main(String[] arguments) { System.out.println("시작 인스턴스 " +

InstanceCounter.getCount());

for (int i = 0; i < 500; ++i) { new InstanceCounter();

}

System.out.println("만들어진 인스턴스 " + InstanceCounter.getCount());

}

(11)

} 결과

시작 인스턴스 0 만들어진 인스턴스 500

 final

final 변수는 한 번만 명시적으로 초기화 할 수 있습니다. Final 로 선언된 참조 변수는 다른 객체를 참조하도록 다시 할당 될 수 없습니다.

변수를 사용하면 final 은 static 과 함께 사용되어 상수를 클래스 변수로 만듭니다.

예제

public class Myjava {

final int width = 10;

// 상수를 선언하는 예입니다.

public static final int DOGAGE = 4;

static final String NAME = "Andy";

public void changewidth() {

width = 12; // 에러를 발생시킵니다.

} }

위의 예제를 실행하면 에러가 뜹니다.

앞에서 언급했듯이 final 은 서브 클래스에서 메소드가 수정되는 것을 방지하기 때문입니 다.

만약 클래스가 final 로 표시되면 어떤 클래스도 final 클래스로부터 기능을 상속할 수 없 습니다.

 abstract

abstract 클래스는 인스턴스화 할 수 없습니다. 클래스가 abstract 로 선언되는 유일한 목적은 클래스를 확장하기 위함입니다.

클래스는 abstract 하며 final 할 수 없습니다. (final 클래스는 확장할 수 없기 때문에) 클래스에 추상적 메소드가 포함되어 있으면 클래스는 abstract 로 선언되어야 합니다.

그렇지 않으면 컴파일 오류가 뜨게 됩니다.

(12)

abstract 클래스는 추상적인 메소드와 일반적인 메소드를 모두 포함할 수 있습니다.

예제

abstract class Car {

public String cName;

public abstract void brand(); // 추상적 메소드 }

class Kia extends Car { public void brand() {

System.out.println("기아");

} }

class Hyundai extends Car { public void brand() {

System.out.println("현대");

} }

public class Myjava {

public static void main(String[] args) { Kia k7 = new Kia();

Hyundai sonata = new Hyundai();

k7.brand();

sonata.brand();

} }

결과 기아 현대

 synchronized

synchronized 는 여러 개의 스레드가 아닌 한 번에 하나의 스레드로만 접근할 수 있음을 나타내는 데 사용되는 동기화 키워드입니다. Synchronized 수식자는 네 개의 접근제어자 들과 함께 적용될 수 있습니다.

class Test{

static int i=0, j =0;

static synchronized void one() { i++; j++; } static synchronized void two() {

System.out.println("i=" + i + " j=" +j);

} }

(13)

실습) Point 클래스는 평면상의 x,y 좌표 값들을 저장하는 데 사용되는 클래스이다.

Point 클래스의 x, y 값은 private double 값으로 선언되며 다음과 같은 메소드를 가진 다.

 x, y 값을 매개변수로 받아 변경하는 메소드.

 원점을 기준으로 90 도 시계방향으로 회전한 후 그 결과 x, y 값을 저장하는 메소 드.

 현재의 x, y 값을 보여주는 메소드

Point 클래스를 생성하고 Point 클래스의 인스턴스를 1 개 만들며 위의 메소드들을 모두 테스트 할 수 있는 PointManager.java 도 작성하라.

(14)

5. 제어구조

연산자

 산술연산자

산술 연산자는 수학 식의 대수에서 사용되는 것과 같은 방식으로 사용됩니다.

다음표에서는 산술 연산자를 나열합니다.

정수 변수 A 가 10 을, 변수 B 가 20 이라 가정하고 연산을 수행하면 다음의 표와 같은 결과 를 보여줍니다.

연산자 설명 예

+ (더하기) 연산자의 양쪽 값을 더함 A + B = 30

- (뺄셈) 왼쪽 피연산자에서 오른쪽 피연산자를

뺍니다 A – B = -10

* (곱셈) 연산자 양쪽의 값을 곱함 A * B = 200

/ (나누기) 왼쪽 피연산자를 오른쪽 피연산자로 나눔 B / A = 2

% (나머지) 왼쪽 피 연산자를 오른쪽 피연산자로

나누고 나머지 반환 B % A = 0

++ (증가) 피연산자의 값을 1 증가 B++ => 21 -- (감소) 피연산자의 값을 1 감소 B-- => 19

 관계연산자

다음은 Java 가 지원하는 관계 연산자입니다.

정수 변수 A 가 10 을, 변수 B 가 20 이라 가정하고 연산을 수행하면 다음 표의 예와 같은 결과를 보여줍니다.

(15)

연산자 설명 예

== (같음)

두 피연산자의 값이 같은 지 아닌지 확인합니다. 값이 같으면 참입니다.

(A == B) 는 거짓입니다

!= (같지 않음)

두 피연산자의 값이 같은 지 아닌지 확인합니다. 값이 같지 않으면 참입니다.

(A != B) 는 참입니다.

> (보다 큼)

왼쪽 피연산자의 값이 오른쪽 피연산자의 값보다 큰 지 검사합니다

(A > B)는 거짓입니다.

< (보다 작음)

왼쪽 피연산자의 값이 오른쪽 피연산자의 값보다 작은 지 검사합니다.

(A < B) 는 참입니다.

>= (보다 크거나 같음)

왼쪽 피연산자의 값이 오른쪽 피연산자의 값보다 크거나 같은 지 검사합니다.

(A >= B) 는 거짓입니다.

<= (보다 작거나 같음)

왼쪽 피연산자의 값이 오른쪽 피연산자의 값보다 작거나 같은 지 검사합니다.

(A <= B)는 참입니다.

 비트 연산자

자바는 long, int, short, char 및 byte 와 같은 정수 유형에 적용할 수 있는 여러 비트 연산자를 정의하였습니다.

비트 연산자는 비트에 대해 작업하고 비트 단위로 작업을 수행합니다. A = 60, B = 13 이 라고 가정합니다. 이제 이진 형식으로 다음과 같이 될 것입니다.

A = 0011 1100 B = 0000 1101 ---

A & B = 0000 1100

(16)

A | B = 0011 1101 A ^ B = 0011 0001

~ A = 1100 0011

다음은 비트 연산자를 나열한 표입니다.

연산자 설명 예

& (and) 이진 AND 연산자는 두 피연산자 모두에 비트가 있으면 결과에 복사합니다.

(A & B) 는 0000 1100

| (or) 이진 OR 연산자는 피연산자에 비트가 있으면 비트를 복사합니다.

(A | B)는 0011 1101

^ (XOR)

이진 XOR 연산자는 비트가 둘 다 가 아닌 하나의 피연산자에만 설정된 경우 비트를

복사합니다.

(A ^ B)는 0011 0001

~ 'Flipping'비트의 효과가 있습니다. (~A) 는 1100 0011

<< (왼쪽 시프트) 왼쪽 피연산자 값은 오른쪽 피연산자가 지정한 비트 수만큼 왼쪽으로 이동합니다.

A << 2 는 1111 0000.

>> (오른쪽 시프트)

왼쪽 피연산자 값은 오른쪽 피연산자가 지정한 비트 수만큼 오른쪽으로 이동합니다.

A >> 2 는 1111

>>> (제로 채우기 오른쪽 시프트)

왼쪽 피연산자 값은 오른쪽 피연산자에 의해 지정된 비트 수만큼 오른쪽으로 이동되고

시프트 값은 0 으로 채워집니다.

A >>> 2 는 0000 1111

 논리연산자

다음은 논리연산자를 나열한 표입니다.

다음 표에서는 부울 변수 A 가 참이고 변수 B 가 거짓이라 가정하였습니다.

(17)

연산자 설명 예

&& ( 논리 and) 두 피연산자가 모두 0 이 아니면 참 ( A && B ) 는 거짓

|| ( 논리 or) 두 피연산자 중 하나라도 0 이 아닌

경우 참 ( A || B ) 는 참

! ( 논리 not) 조건이 참이면 논리 not 연산자는

거짓으로 만듬 ! ( A && B ) 는 참

 할당연산자

다음은 자바에서 지원되는 할당 연산자입니다.

연산자 설명 예

= 오른쪽 피연산자의 값을 왼쪽 피연산자에 대입 C = A + B += 왼쪽 피연산자에 오른쪽 피연산자를 더하고 그

결과를 왼쪽 피연산자에 대입

C += A

-= 왼쪽 피연산자에서 오른쪽 피연산자를 빼고 왼쪽 피연산자에 결과를 대입

C -= A

*= 오른쪽 피연산자에 왼쪽 피연산자를 곱하고 그 결과를 왼쪽 피연산자에 대입

C *= A

/= 왼쪽 피연산자와 오른쪽 피연산자를 나눠서 결과를 왼쪽 피연산자에 대입

C /= A

%= 두 개의 피연산자를 사용하여 나머지를 구하고 그 결과를 왼쪽 피연산자에 대입

C %= A

<<= 왼쪽 시프트 대입 연산자 C <<= 2

>>= 오른쪽 시프트 대입 연산자 C >>=2

&= AND 대입 연산자 C &= 2

^= NOR 대입 연산자 C ^= 2

|= OR 대입 연산자 C |= 2

(18)

 기타 연산자

Instanceof 연산자

이 연산자는 객체 참조 변수에만 사용됩니다. 연산자는 객체가 특정 유형 (클래스 유형 또는 인터페이스 유형) 인지 여부를 확인합니다.

Instanceof 를 이용한 연산결과로 true 를 얻었다는 것은 참조변수가 검사한 타입으로 형변환이 가능하다는 것을 뜻합니다.

예제

public static void main(String args[]) {

String name = "호날두";

// following will return true since name is type of String boolean result = name instanceof String;

System.out.println( result );

}

그러면 다음 결과가 출력됩니다.

true

이 연산자는 비교 대상이 오른쪽에 있는 유형과 호환되는 할당인 경우 여전히 true 를 반환합니다.

다음은 또 다른 예제입니다.

class Sofa {}

public class Home extends Sofa {

public static void main(String args[]) {

(19)

Sofa a = new Home();

boolean result = a instanceof Home;

System.out.println( result );

}

}

그러면 다음 결과가 생성됩니다.

true

루프

 While

주어진 조건이 참일 때 명령문 또는 명령문 그룹을 반복합니다. 루프 본문을 실행하기 전에 조건을 테스트합니다.

예제

public class Myjava {

public static void main(String args[]) { int x = 1;

while( x < 10 ) {

System.out.print("x 의 값은 : " + x );

x++;

System.out.print("\n");

} } }

그러면 다음과 같은 결과가 출력됩니다.

x 의 값은 : 1 x 의 값은 : 2 x 의 값은 : 3 x 의 값은 : 4

(20)

x 의 값은 : 5 x 의 값은 : 6 x 의 값은 : 7 x 의 값은 : 8 x 의 값은 : 9

 For

for 루프는 특정 횟수를 실행해야 하는 루프를 효율적으로 작성할 수 있는 반복 제어 구조입니다. for 루프문은 작업을 몇 번 반복해야 하는지를 알 때 유용합니다.

예제

public class Myjava {

public static void main(String args[]) { for(int y = 100; y < 110; y++) {

System.out.print("y 의 값은 : " + y );

System.out.print("\n");

} } }

결과

y 의 값은 : 100 y 의 값은 : 101 y 의 값은 : 102 y 의 값은 : 103 y 의 값은 : 104 y 의 값은 : 105 y 의 값은 : 106 y 의 값은 : 107 y 의 값은 : 108 y 의 값은 : 109

(21)

 Break

루프 또는 switch 문을 종료하고 루프 또는 switch 바로 다음 명령문으로 실행을 전송합니 다.

예제 1.

public class Myjava {

public static void main(String args[]) { int [] numbers = {1, 3, 5, 7, 9};

for(int x : numbers ) { if( x == 7 ) {

break;

}

System.out.print( x );

System.out.print("\n");

} } }

결과 1 3 5

예제 2.

public class Myjava {

public static void main(String[] args) { char c;

try {

System.out.println("q를 입력하면 종료합니다.");

c = (char) System.in.read();

while(true) {

if(c== 'q') { break;

}

System.out.print(c);

c = (char) System.in.read();

}

} catch (Exception e) {

System.out.println(e);

} }

} 결과

q를 입력하면 종료합니다.

a

(22)

b b q

 Continue

continue 키워드는 루프 제어 구조에서 사용할 수 있습니다. 이것은 루프가 루프의 다음 반복으로 바로 건너 뛰게 합니다.

예제

public class Myjava {

public static void main(String args[]) { int [] numbers = {1, 3, 5, 7, 9};

for(int x : numbers ) { if( x == 7 ) {

continue;

}

System.out.print( x );

System.out.print("\n");

} } }

결과 1 3 5 9

 개선된 for 루프

Java 5 부터 개선된 for 루프가 도입되었습니다. 이것은 주로 배열을 포함한 요소의 컬렉 션을 가로 지르는 데 사용됩니다.

예제

public class Myjava {

(23)

int [] numbers = {1, 3, 5, 7, 9};

for(int x : numbers ) { System.out.print( x );

System.out.print(",");

}

System.out.print("\n");

String [] names = {"정보", "통신", "공학"};

for( String name : names ) { System.out.print( name );

System.out.print(",");

} } }

결과

1,3,5,7,9, 정보,통신,공학,

조건문

 If else

If 문은 하나 이상의 문 뒤에 부울 표현식으로 구성되어 있고 if 문 실행 뒤 else 문이 실 행됩니다.

예제

public class Myjava {

public static void main(String args[]) { int year = 2019;

if( year < 2000 ) {

System.out.print("if 문입니다.");

}else {

System.out.print("else 문입니다.");

} } }

결과

else 문입니다.

(24)

 Switch

스위치 문은 변수가 값에 대해 평등하게 테스트합니다. 각 값을 case 라고 하며, 각 case 마다 검사됩니다.

예제 1.

public class Myjava {

public static void main(String args[]) { char grade = 'A';

switch(grade) { case 'A' :

System.out.println("아주 좋아요!");

break;

case 'B' :

System.out.println("굳!");

break;

case 'C' :

System.out.println("음..");

break;

case 'F' :

System.out.println("망했다");

break;

default :

System.out.println("올바르지 않은 입력입니다");

}

System.out.println("당신의 점수는 " + grade);

} }

결과

아주 좋아요!

당신의 점수는 A

예제 2.

import java.io.*;

public class YesOrNo {

public static void main(String[] args) { System.out.println("Y / N ?");

try {

char c = (char)System.in.read();

switch(c) { case 'Y':

System.out.println("Yes!!");

(25)

break;

case 'N':

System.out.println("No!!");

break;

default:

System.out.println("Y/N 을 눌러주십시오");

break;

}

}catch(IOException e) {}

} }

결과 Y / N ? Y Yes!!

 ? :

이 연산자는 삼항 연산자라고 하며 세 개의 피연산자로 구성되며 부울 식을 계산하는 데 사용됩니다.

다음은 그 예입니다.

public class Myjava {

public static void main(String args[]) { int a, b;

a = 5;

b = (a == 1) ? 10: 100;

System.out.println( "b 의 값은 : " + b );

b = (a == 5) ? 10: 100;

System.out.println( "b 의 값은 : " + b );

} }

그러면 다음 결과가 출력됩니다.

b 의 값은 : 100

(26)

실습) A 대학 연구팀에서는 아이의 예상 최종 키 크기를 도출할 수 있는 공식을 개발하였다고 한다. 이 공식은 다음과 같다.

남자 예상 키 = (엄마 키 * 6/5 + 아빠 키) /2 여자 예상 키 = (엄마 키 + 아빠 키 * 5/6 )/2

이 공식을 사용하여 아이의 최종 키를 계산하는 HeigtPredictor 클래스를 작성하여라.

입력값은 생성자를 통해 주어지며 아이는 남자아이 2, 여자아이 2 총 4 개의 인스턴스를 생성하고 이 들의 최종 예상 키를 출력하도록 하는 HeightManager.java 클래스도 만든다.

이를 위해 적절한 생성자와 최종 키를 출력하는 메소드들을 작성한다.

(27)

6. Wrapper Class

Integer

일반적으로 Integer 에서 작업할 때는 byte, int, long, double 과 같은 기본 데이터 유형을 사용합니다. 하지만 개발 단계에서는 기본 데이터 유형 대신 객체를 사용해야하는 경우가 있습니다. 이를 위해 Java 는 wrapper 클래스를 제공합니다.

모든 wrapper 클래스 (Integer, Long, Byte, Double, Float, Short)는 Integer 클래스의 서브 클래스입니다. Wrapper 클래스의 객체는 각각의 기본 데이터 유형을 포함합니다. 기본 데이터 유형을 객체로 변환하는 것을 boxing 이라고 합니다. wrapper 클래스를 사용하는 동안 기본 데이터 형식의 값을 wrapper 클래스의 생성자에 전달하면 됩니다. 그리고 wrapper 객체가 다시 기본 데이터 형식으로 다시 변환되는데 이 과정을 unboxing 이라고 합니다.

다음은 boxing 과 unboxing 에 대한 예제입니다.

예제

public class Myjava {

public static void main(String args[]) {

Integer z = 10; // int 를 Interger 객체로 boxing z = z + 100; // Integer 를 int 로 unboxing System.out.println(z);

} }

결과 110

z 에 정수 값이 지정되면 컴파일러는 z 가 정수 객체이므로 정수를 Boxing 합니다.

X 는 unboxed 이므로 나중에 정수를 더 추가할 수도 있습니다.

다음은 Integer 클래스의 모든 서브 클래스가 구현하는 인스턴스 메소드 목록입니다.

xxxValue ( ) Number 객체의 값을 xxx 데이터 유형으로 변환하여 반환합니다.

(28)

compardTo ( ) Number 객체를 인수와 비교 합니다.

equals ( ) 객체가 인수와 동일한 지 판단합니다.

valueOf ( ) 지정된 기본 데이터 형식값을 보유하는 Integer 객체를 반환합니다.

toString ( ) 지정된 int 또는 Integer 값을 나타내는 String 객체를 반환합니다.

parseInt ( ) 이 메소드는 특정 String 의 기본 데이터 유형을 가져 오는 데 사용됩니다.

abs ( ) 인수의 절댓값을 반환합니다.

ceil ( ) 인수보다 크거나 같은 가장 작은 정수를 구합니다

floor( ) 인수보다 작거나 같은 가장 큰 정수를 구합니다.

rint ( ) 인수에 값이 가장 가까운 정수를 반환합니다.

round ( ) 인수에 메소드의 반환 유형이 나타내는 가장 가까운 long 또는 int 를 반환합니다.

min ( ) 2 개의 인수 중 작은 것을 반환줍니다.

max ( ) 2 개의 인수 중에서 더 큰 것을 반환합니다.

exp ( ) 자연 대수의 밑수 e 를 인수의 제곱으로 반환합니다.

log ( ) 인수의 자연 대수를 반환합니다.

pow ( ) 첫 번째 인수의 값을 두 번째 인수로 제곱한 값을 반환합니다.

sqrt ( ) 인수의 제곱근을 반환합니다.

sin ( ) 지정된 double 값의 사인을 반환합니다.

cos ( ) 지정된 double 값의 코사인을 반환합니다.

tan ( ) 지정된 double 값의 탄젠트를 반환합니다.

(29)

asin( ) 지정된 double 값의 아크 사인을 반환합니다.

acos( ) 지정된 double 값의 아크 코사인을 반환합니다.

atan ( ) 지정된 double 값의 아크 탄젠트를 반환합니다.

atan2 ( ) 직각 좌표 (x, y)를 극좌표 (r, theta)로 변환하고 theta 를 반환합니다.

toDegrees ( ) 인수를 각도로 변환합니다.

toradians ( ) 인수를 라디안으로 변환합니다.

random ( ) 난수를 반환합니다.

Java – random( ) 메소드

이 메소드는 0.0 에서 1.0 사이의 난수를 생성하는 데 사용됩니다.

예제

public class Myjava {

public static void main(String args[]) { System.out.println( Math.random() );

System.out.println( Math.random() );

} }

결과

0.6770110353889172 0.8368732812415268

Character

일반적으로 문자로 작업할 때는 기본 데이터 유형 char 을 사용합니다.

char ch = 'a';

(30)

//char의 배열

char[] charArray ={ 'a', 'b', 'c', 'd', 'e' };

그러나 개발 중에는 기본 데이터 유형 대신 객체를 사용해야하는 상황이 있습니다. 이런 경우를 위해 Java 는 기본 데이터 유형 char 에 wrapper 클래스 Character 를 제공합니다.

//여기서 기본 char 'a'를 따옵니다.

//Character 객체 ch에 boxing 되었습니다.

Character ch = 'a';

//여기서 기본적인 'x'는 메소드 테스트를 위해 boxing 됩니다.

//변환값은 char 'c'로 unboing됩니다.

char c = test('x');

아래는 Character 클래스의 모든 서브 클래스가 구현하는 중요한 인스턴스 메소드 리스트 입니다.

isLetter ( ) 지정된 char 가 문자인지 판별합니다.

isDigit ( ) 지정된 char 값이 숫자인지 판별합니다

isWhitespace ( ) 지정된 char 값이 공백인지 판별합니다.

isUpperCase ( ) 지정된 char 값이 대문자인지 여부를 판별합니다.

isLowerCase ( ) 지정된 char 값이 소문자인지 여부를 판별합니다.

toUpperCase ( ) 지정된 char 값의 대문자 형식을 반환합니다.

toLowerCase ( ) 지정된 char 값의 소문자 형식을 반환합니다.

toString ( ) 지정된 문자 값을 나타내는 String 객체를 반환합니다. 이 객체는 한 문자로 구성된 문자열입니다.

Java – toUpperCase( ) , toLowerCase( ) 메소드 예제

public class Myjava {

(31)

public static void main(String args[]) {

System.out.println(Character.toUpperCase('a'));

System.out.println(Character.toUpperCase('A'));

System.out.println(Character.toLowerCase('b'));

System.out.println(Character.toLowerCase('B'));

} }

결과 A A b b

String

 String 생성

문자열을 생성하는 가장 직접적인 방법은 다음과 같이 작성하는 것입니다.

String greeting = "안녕하세요!";

다른 객체와 마찬가지로 new 키워드와 생성자를 사용하여 String 객체를 만들 수 있습니 다. String 클래스에는 문자 배열과 같은 소스를 사용하여 문자열의 초기 값을 제공할 수 있는 11 개의 생성자가 있습니다.

예제

public class StringDemo {

public static void main(String args[]) {

char[] helloArray = { '안', '녕', '하', '세', '요', '.' };

String helloString = new String(helloArray);

System.out.println( helloString );

} }

결과

안녕하세요.

※String 클래스는 변경할 수 없으므로 일단 생성되면 String 객체를 변경할 수 없습니다.

 String 길이 구하기

객체에 대한 정보를 얻기 위해 사용되는 메소드를 accessor 메소드라고 합니다.

문자열과 함께 사용할 수 있는 accessor 메소드 중 하나는 문자열 객체에 포함된 문자 수 를 반환해주는 length() 메소드입니다.

(32)

예제

public class StringDemo {

public static void main(String args[]) {

String strlength = "문자열 길이가 얼마나 될까요";

int len = strlength.length();

System.out.println( "문자열 길이: " + len );

} }

결과

문자열 길이: 15

 두 문자열 붙이기

String 클래스에는 두 개의 문자열을 연결하는 메소드가 포함되어 있습니다.

다음과 같이 문자열과 함께 concat() 메소드를 사용할 수 있습니다.

"독도는 ".concat("우리땅");

하지만 대부분 +를 이용하여 문자열들을 연결합니다.

예제

public class StringDemo {

public static void main(String args[]) { String string1 = "통신 ";

System.out.println("정보 " + string1 + "공학");

} }

결과

정보 통신 공학

다음은 String 클래스가 지원하는 메소드 목록입니다.

char charAt(int index) 지정된 인덱스의 문자를 반환 int compareTo(Object o) 문자열을 다른 객체와 비교 int compareTo(String another

String) 두 문자열을 사전순으로 비교 int compareToIgnoreCase(String

str) 대소 문자 차이를 무시하고 사전순으로 두 문자

열을 비교

String concat(String str) 지정된 문자열을 문자열의 끝에 연결

(33)

boolean

contentEquals(StringBuffer sb) 문자열이 지정된 StringBuffer 와 같은 문자열을 나타내는 경우에 한정해 true 를 리턴

static String

copyValueOf(char[] data) 지정된 배열의 문자열을 나타내는 문자열 반환 static String

copyValueOf(char[]data, int offset, int count)

지정된 배열의 문자열을 나타내는 문자열 반환

boolean endsWith(String suffix) 문자열이 지정된 접미어로 끝나는 지 테스트 boolean equals(Object anObject) 문자열을 지정된 객체와 비교

boolean equalsIgnoreCase(String

anotherString) 대소 문자를 고려하지 않고 이 문자열을 다른 문 자열과 비교

byte getBytes() 플랫폼의 기본 문자셋을 사용하여 ㅁㄴ자열을 바 이트 시퀀스로 인코딩하여 결과를 새로운 바이트 배열에 저장

byte[] getBytes(String charsetName)

명명된 charset 을 사용하여 문자열을 바이트 시 퀀스로 인코딩하여 결과를 새 바이트 배열에 저 장

void getChars(int srcBegin, int srcEnd, char[] dst, int

dstBegin)

문자열의 문자를 대상 문자 배열로 복사

int hashCode() 문자열의 해시코드를 반환

int indexOf(int ch) 문자열 내에서 지정된 문자가 처음 나타나는 인 덱스 반환

int indexOf(int ch, int

fromIndex) 지정된 인덱스에서 검색을 시작하여 지정된 문자 가 처음 나타나는 이 문자열 내의 인덱스 반환 int indexOf(String str) 지정된 문자열이 처음 나타나는 문자열 내의 인

덱스 반환 int indexOf(String str, int

fromIndex) 지정된 인덱스에서 시작하여 지정된 부분 문자열 이 처음 나타나는 문자열 내의 인덱스 반환 String intern() 문자열 객체의 표준 표현 반환

int lastIndexOf(int ch) 이 문자열 내에서 지정된 문자의 마지막 항목 인 덱스 반환

int lastIndexOf(int ch, int fromIndex)

지정된 문자부터 마지막으로 검색하면서 지정된 문자가 마지막으로 나타나는 문자열 내의 인덱스 반환

(34)

int lastIndexOf(String str) 문자열 내에서 지정된 부분 문자열의 가장 오른 쪽에 나오는 인덱스 반환

int lastIndexOf(String str, int fromIndex)

지정된 문자열에서 마지막으로 나타나는 부분 문 자열의 인덱스를 반환하여 지정된 인덱스에서 시 작하여 뒤로 검색

int length() 문자열의 길이반환

boolean matches(String regex) 문자열이 주어진 정규식과 일치하는지 여부확인 Boolean regionMatches(boolean

ignoreCase, int toffset, String other, int ooffset, int len)

두 문자열 영역이 같은지 테스트

boolean regionMatches(int toffset, String other, int

ooffset, int len)

두 문자열 영역이 같은지 테스트

String replace(char oldChar,

char newChar) 문자열에서 모든 oldchar 을 newChar 로 바꾼 결 과로 새 문자열을 반환

String replaceAll(String regex,

String replacement) 주어진 정규 표현식과 일치하는 문자열의 각 부 분 문자열을 주어진 문자열로 교체

String replaceFirst(String

regex, String replacement) 주어진 정규 표현식과 일치하는 문자열의 첫 번 째 부분 문자열을 지정된 문자열로 교체

String[]split(String regex) 주어진 정규 표현식과 일치하는 문자열 분할 String[]split(String regex, int

limit) 주어진 정규 표현식과 일치하는 문자열 분할 boolean startsWith(String

prefix) 문자열이 지정된 접두어로 시작하는지 테스트 Boolean startsWith(String

prefix, int toffset) 문자열이 지정된 인덱스로 시작하는 접두어로 시 작하는지 테스트

CharSequence subsequence(int

beginIndex, int endIndex) 이 시퀀스의 서브시퀀스를 반환 String substring(int

beginIndex) 문자열의 하위 문자열인 새 문자열 반환 String substring(int

beginIndex, int endIndex) 문자열의 하위 문자열인 새 문자열 반환 char[] tocharArray() 지정된 배열을 새 문자열로 변환

String toLowerCase() 문자열의 모든 문자를 소문자로 변환 String toLowerCase(Locale

locale) 지정된 로케일 규칙을 사용하여 문자열의 모든

(35)

문자를 소문자로 변환 String toString() 객체가 그대로 반환

String toUpperCase() 문자열의 모든 문자를 대문자로 변환 String toUpperCase(Locale

locale) 지정된 로케일 규칙을 사용하여 문자열의 모든 문자를 대문자로 변환

String trim() 선행 및 후행 공백이 생략된 문자열 사본을 반환 static String valueOf(primitive

data type x) 전달된 데이터 형식 인수의 문자열 표현을 반환

실습) 𝑎𝑏를 계산하는 pow(int a, int b) 함수를 재귀적 함수를 이용해서 작성하라.

단 b 는 양의 정수이다.

참조

관련 문서

수험생은 지원한 대학에서 지정하는 장소에 지정된 시간까지 반드시 입실하여 관계자의 안내에 따라야 하며, 지정된 시간까지 고사장에 입실하지

수험생은 지원한 대학에서 지정하는 장소에 지정된 시간까지 반드시 입실하여 관계자의 안내에 따라야 하며, 지정된 시간까지 고사장에 입실하지

• 그 밖의 경우 물품이 매도인의 운송수단 상에서 양화되지 아니하고 매수인에 의하여 지정된 운송인 또는 기타의 자의 임의처분상태로 둘 때 인도가 완료되는 것이며

전시사변 또는 이에 준하는 비상 시에 국민경제에 긴요한 물 자와 군수물자를 수송하기 위한 국제선박으로서 제8조제1항 에 따라

수퍼클래스가 아닌 현재 클래스의 지정된 초기자 호출 초기화 작업을 변경하고 싶으면 지정된 초기자만 변경 지정된 초기자에서만

LISTBOX 리스트박스 윈도우 (문자열 목록을 가지며 선택된 문자열 표시) RichEdit 리치에디트 윈도우 (에디트 윈도우 보다 풍부한 편집기능 보유) SCROLLBAR

Ø 소유 또는 사용중인 각종 재물 또는 동산을 도난당하여 입는 경제적 손실과 도난과정에서 발생한 물리적 손실을 보상. §

-Reverse : 등록되어 있는 데이터들의 순서를 역순으로 정렬하고 결과를 List 형식으로 반환 -Sort : 등록되어 있는 데이터들의 순서를 올림순으로 정렬하고 결과를 List