학습 개요
- 같은 유형의 자료 집단을 표현하기 위한 배열의 사용 방법을 살펴봄
- 문자열을 다룰 때 사용하는
String
클래스의 기본 사항을 알아보고 문자열과 관련된 형변환을 학습함 - 프로그램에서 키보드나 파일로부터 데이터를 입력받는 방법을 학습하고 클래스 정의 문법과 객체 생성 방법을 확인함
학습 목표
- 프로그램에서 배열을 선언하고 사용 가능함
- 문자열의 덧셈 연산과 형변환을 이해할 수 있음
- 간단한 입출력 기능을 프로그램에 추가 할 수 있음
- 클래스를 정의 할 수 있음
- 클래스와 데이터필드의 접근 제어자에 관해 설명할 수 있음
강의록
배열
배열
- 같은 자료형의 원소를 정해진 개수만큼 가지고 있는 객체
- 원소들의 묶음
- 배열의 크기는 선언할 때가 아닌 배열이 초기화 또는 생성될 때 정해짐
- 숫자 인덱스(첨자) 사용해 특정 원소를 다룸
- 배열의 선언
- 선언할 때 크기 지정 불가
- 형식
자료형[] 변수이름
;자료형 변수이름[]
;
ex) 1차형 배열
1 2
int[] a; int b[];
ex) 2차형 배열
1 2 3
int[][] c; int d[][]; int[] e[];
ex) 오류
1
int f[10];
- 대표적인 참조형(클래스, 인터페이스, 배열)
- 배열 원소에 대한 주소 값만 가지고 있음
- 실제 데이터가 들어갈 공간 할당 받아 사용
배열의 초기화
- 선언과 동시에 중괄호 이용해 초기 값 지정
- 자동으로 메모리 공간 확보
- 초기화 또는 생성 과정 거쳐야 배열의 원소 사용 가능
ex) 선언과 동시에 초기화
1
int a[] = {2, 3, 5, 7, 11};
1
int anArray[][] = { {1, 2, 3}, {4, 5, 6} };
ex) 오류
1
int b[]; b = {4, 5, 6};
배열의 생성
- 배열의 원소가 사용할 메모리 공간 생성
new
연산자 이용- 배열의 크기 정하고 메모리 공간 확보
new
연산자는 메모리의 주소 값 리턴- 원소가 숫자인 경우 0, 참조형인 경우 null로 자동 초기화
ex) 선언과 생성
1 2 3
int a[] = new int[3]; int b[]; b = new int[10]; int anArray4[][] = new int[3][2];
배열의 크기
배열은 크기를 가지는 내장 속성
length
가지고 있음1 2 3 4 5 6 7 8
public class Main { public static void main(String args[]) { int twoArray[][] = { {0, 1}, {10, 11, 12} }; // 선언과 동시에 초기화 for (int i = 0; i < twoArray.length; i++) for (int j = 0; j < twoArray[i].length; j++) System.out.println(twoArray[i][j]); } }
- 형식 :
배열이름.length
- 형식 :
문자열
String
클래스
String
클래스는 문자열을 표현하고 처리하기 위한 참조형String
형의 변수는 참조형이나 기본형 변수처럼 사용 가능- 참조형 변수는 선언 후
new
연산자 이용해 실제 데이터 들어갈 공간 할당 받아 써야 함
- 참조형 변수는 선언 후
- 문자열 리터럴
- 이중 따옴표를 사용
ex) 기본형 변수처럼 사용 가능
1
String s1 = "Java";
ex) 생성자 사용
1
String s2 = new String("Java");
참조형 변수에는 null이라는 특별한 값 지정 가능
1 2 3
if (s1 != null ) { }
- 이중 따옴표를 사용
문자열의 +
연산자
- 두 문자열을 연결하는 것
- (문자열 + 기본형) 또는 (문자열 + 다른 참조형)도 가능
+
연산자 사용 시 기본형(또는 다른 참조형) 값은 문자열로 자동 형변환 가능
print()
나println()
에서 자주 사용- 1개 매개변수를 문자열로 바꿔 출력함
System.out
은 화면 출력을 위한 객체1 2 3
System.out.println("result =" + " " + result); System.out.println('A' + 0); // 문자 char + 숫자 int = 65 System.out.println("A" + 0); // 문자열 String + 숫자 int = A0
Scanner
클래스와 입출력
Scanner
클래스
- 키보드(표준 입력)나 파일로부터 다양한 자료 입력 받을 때 사용
- 기본적으로 공백 문자로 구분되는 단어(토큰) 단위로 입력
- 문자열이나 기본형 값의 입력 위해
next()
또는nextInt()
와 같은 입력 메소드 제공ex) 단어 입력
1
next()
ex) 단어 int 값으로 해석
1
nextInt()
- 클래스에 관한 API 설명 페이지
- 키보드에서 입력을 받는
Scanner
객체 만들기System.in
이용해Scanner
객체 만들고 사용1 2
Scanner sc = new Scanner(System.in); // 인자로 표준 입력 이용해 객체 생성 String name = sc.next(); // 객체 변수로 단어 입력 받음
Scanner
클래스를 사용한 입력
Scanner
클래스의 입력용 메소드1 2
Scanner s = new Scanner(System.in); String name = s.next();
1 2 3 4 5 6 7 8 9 10 11 12
import java.util.Scanner; public class ScannerTest { public static void main(String[] args) { Scanner sc = new Scanner(System.in); // scanner 객체 생성 if (sc.hasNextInt()) { // int 값이 있을 경우 true 반환 System.out.println(sc.nextInt()); } else { System.out.println("It's not Integer"); } } }
1 2 3 4 5 6 7 8 9 10
import java.util.Scanner; public class ScannerTest2 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); // scanner 객체 생성 while(sc.hasNextInt()) { // 단어 입력 시 검사 System.out.println(sc.nextInt()); } } }
boolean hasNext()
- next 수행 전 다음 단어가 있으면 true 반환
String next()
- 다음 단어를 읽어 String으로 반환
boolean hasNextInt()
- next 수행 전 다음 단어가 int 값이 있을 경우 true 반환
int nextInt()
- 다음 단어를 읽어 int 값으로 반환
boolean hasNextDouble()
- next 수행 전 다음 단어가 double 값이 있을 경우 true 반환
double nextDouble()
- 다음 단어를 읽어 double 값으로 반환
boolean hasNextLine()
- next 수행 전 다음 라인이 있으면 true 반환
String nextLine();
- 다음 라인을 읽어 String으로 반환
클래스 정의
클래스 정의
- 동종 객체를 표현하기 위한 데이터 필드(멤버 변수)와 메소드를 정의함
- 부모 클래스의 상속, 인터페이스 구현, 추상 클래스,
final
클래스 등을 정함 클래스 정의 문법
1 2 3 4 5 6
[접근 제어자] class 클래스이름 [extends 부모클래스이름] [implements 인터페이스 이름] { // 클래스 정의 <데이터 필드 선언>; <생성자 선언>; <메소드 선언>; }
- 클래스 접근 제어자
- 클래스 사용 시 어디서 접근 가능한지 지정
- 생략,
public
,protected
,private
- 클래스 비접근 제어자
abstract
,final
abstract
클래스는 상속 가능final
클래스는 상속 불가능
- 클래스 접근 제어자
- 헤더와 몸체로 구성됨
- 클래스 정의 내부에 존재함
메소드 정의 문법
1 2 3 4
[접근 제어자]반환형 메소드 이름([자료형 인자[, 자료형 인자]]) [throws 예외 이름] { <문장> }
1 2 3 4 5
class Circle { public double getArea() { return this.r * this.r * 3.14; } }
클래스의 정의와 사용
- 클래스 정의에서 데이터 필드와 메소드
- 인스턴스 변수(메소드)와 클래스 변수(메소드)
- 개별 객체가 소유하는 인스턴스 변수와 인스턴스 메소드
- 클래스에 속한 객체가 공유하는 클래스 변수(
static
변수, 정적 변수)와 클래스 메소드
- 객체의 상태는 데이터 필드로, 행위는 메소드로 구현됨
- 메소드는 저장된 데이터를 이용해 기능 수행
- 인스턴스 변수(메소드)와 클래스 변수(메소드)
- 클래스의 사용
- 클래스형 변수를 선언할 때
- 클래스는 객체의 자료형
ex)
1
Circle c;
- 객체를 생성할 때
ex)
1 2
c = new Circle(); s = new String();
- 상속 받아 클래스를 정의할 때
- 클래스형 변수를 선언할 때
클래스의 접근 제어자
- 클래스 접근 제어자의 의미
- 클래스의 사용 범위를 제한하는 것
생략
,public
,private
,protected
private
과protected
는 내부 클래스에서만 사용함
abstract
와final
은 사용 범위를 제한하는 접근 제어자는 아님
- 클래스의 사용 범위를 제한하는 것
- 접근 제어자가 생략된 경우와 public class
- 클래스 선언에서 접근 제어자가 생략된 class
- 같은 패키지에 있는 다른 클래스에서 사용 가능
- 패키지 접근 수준
- public class로 선언된 경우
- 모든 클래스에서 즉, 어디서나 사용 가능
- 클래스 선언에서 접근 제어자가 생략된 class
- 클래스 정의에서 데이터 필드나 메소드를 정의할 때도 접근 제어자를 사용
- 데이터 필드를 사용할 수 있는 범위를 제한하는 것(정보 은닉)
- 메소드의 접근 제어자도 의미가 같음
- 데이터 필드 접근 제어자의 의미
private
필드- 같은 클래스에서만 사용 가능
- 접근 제어자가 생략된 필드
- 같은 패키지에 있는 다른 클래스에서도 사용 가능
protected
필드- 같은 패키지와 자식 클래스에서 사용 가능
public
필드- 모든 클래스에서 사용 가능
아래 4개의 클래스에서 Alpha 클래스의 어떤 멤버를 사용할 수 있는가? (Alpha는 public 클래스라 가정)
ex)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
class Circle { private double r; // 데이터 필드 선언 시에 접근제어자 사용 가능 // r 은 Circle 클래스 안에서만 사용 가능 public Circle(double a) { // 메소드 선언 시에 접근제어자 사용 가능 r = a; } public double getArea() { return r * r * 3.14; } public double getRadius() { return r; } }
1 2 3 4 5 6 7 8 9
public class CircleArea { public static void main(String args[]) { Circle c = new Circle(5); // CircleArea2와 Circle 클래스가 같은 패키지 안에 있을 경우 사용 가능 // System.out.println(c.r); // private 데이터 필드기 때문에 오류 발생 System.out.println(c.getRadius()); // r 을 리턴값으로 가지고 있는 getRadius 메소드 호출해 사용 System.out.println(c.getArea()); } }
객체의 사용
클래스의 사용
- 정의되어 있는 기존 클래스를 사용하는 경우
상속을 위해 클래스를 사용할 때
1 2
Class Csub extends Csuper { }
클래스형 변수를 선언할 때
1
Circle c;
객체를 생성할 때
new
는 메모리 공간을 할당 받고, 생성자를 호출하며, 메모리 참조 값을 리턴하는 연산자1
c = new Circle(5);
객체의 사용
- 생성된 기존 객체를 사용하는 경우
- 객체 변수를 사용하는 경우
- 객체를 메소드의 인자로 전달하는 경우, 부모 유형 변수에 객체를 대입하는 경우 등
- 객체 변수와 점(
.
) 연산자를 사용하여 멤버에 접근하는 경우- 객체가 소유하는 데이터(인스턴스 변수)를 읽거나 쓰기
- 객체를 이용하여 메소드(인스턴스 메소드)를 호출하기
ex) 객체 c를 대입
1
Shape myShape = c;
ex) 객체 c를 전달
1
System.out.println(c);
ex) c의 r을 변경
1
c.r = 5;
ex) c에게
getArea()
실행을 요청1
c.getArea();
- 객체 변수를 사용하는 경우
생성자
- 객체가 생성될 때 자동으로 실행되는 메소드
- 객체의 필드 값을 초기화하거나 메모리 할당 등의 작업
객체 생성 방법은
new
클래스이름(인자)1
Circle c = new Circle(5);
new
연산자를 이용하여 객체를 생성(메모리 할당)하고- 생성자가 호출(데이터 필드의 초기화)되면서
- 객체의 참조 값을 변수에 대입(=)
- 인자가 없는 생성자를 기본 생성자(default constructor)라고 함
생성자의 정의
- 보통의 메소드와 정의 방법이 다름
- 생성자는
new
를 사용하여 객체를 생성할 때 호출됨 - 생성자 정의 방법
- 생성자 이름은 클래스 이름과 같음
- 반환형을 지정할 수 없음
- 한 클래스에서 여러 생성자를 정의할 수 있음(생성자 오버로딩)
- 매개 변수의 개수와 매개 변수의 자료형으로 구분
- 접근 제어자는 보통
public
1 2 3 4 5 6 7 8 9 10 11 12 13 14
public class Circle2 { double r; public Circle2(double a) { r = a; } public double getArea() { return r * r * 3.14; } public double getRadius() { return r; } }
1 2 3 4 5 6 7 8 9
package thethird; public class Circle2Area { public static void main(String args[]) { Circle2 c2 = new Circle2(5.0); System.out.println(c2.r); System.out.println(c2.getArea()); } }
기본 생성자
- 인자가 없는 생성자, 디폴트 생성자(default constuctor)
클래스 정의에서 단 하나의 생성자 정의도 없다면 컴파일러가 다음과 같은 것을 자동으로 만들어줌
1 2
public Circle() { }
- 생성자 몸체의 첫 줄에 부모 생성자의 명시적 호출이 없다면, 다음 코드가 자동으로 들어감
부모 클래스의 기본 생성자를 호출
1
super();
따라서 부모 클래스에서 기본 생성자의 존재를 확인해야 함
- 생성자 몸체의 첫 줄에 부모 생성자의 명시적 호출이 없다면, 다음 코드가 자동으로 들어감
학습 정리
- 배열은 선언 후에 초기화 과정이나 생성 과정을 거쳐야만 사용 가능함
배열이름.length
사용해 배열 크기 표현할 수 있음- 문자열 변수나 리터럴에 대해
+
연산을 적용한 결과는 두 문자열이 연결된 문자열임 Scanner
클래스를 이용하면 키보드나 파일로부터 편리하게 문자열(또는 기본형 값)을 입력 받을 수 있음- 클래스를 정의할 때, 내부 클래스가 아니라면 클래스의 접근 제어자로서 생략과
public
만 지정 가능함 - 정의 부분에서 접근 제어자가 생략 된 클래스나 데이터 필드는 해당 클래스 외에 같은 패키지의 다른 클래스에서만 사용할 수 있음
- 생성자를 정의하려면 이름을 클래스 이름과 같게 하고 반환형을 지정하지 않음
연습 문제
다음 중 문법적으로 올바른 문장은 무엇인가?
a.
1
int[][] c = new int[5][];
int형 변수 i와 j의 값을 각각 출력하기 위해 적당한 출력문은 무엇인가?
a.
1
System.out.println( i + " " + j );
int형 변수 i와 j의 값을 각각 출력하기 위해 적당한 출력문은 무엇인가?
a. Gamma