학습 목차
- 배열
- 문자열
- Scanner 클래스와 입출력
- 클래스 정의
학습 개요
- 같은 유형의 자료 집단을 표현하기 위한 배열의 사용 방법을 살펴봄
- 문자열을 다룰 때 사용하는 String 클래스의 기본 사항을 알아보고 문자열과 관련된 형변환을 학습
- 프로그램에서 키보드나 파일로부터 데이터를 입력받는 방법을 학습하고 클래스 정의 문법 확인
학습 목표
- 프로그램에서 배열을 선언하고 사용 가능
- 문자열의 덧셈 연산과 형변환을 이해
- 간단한 입출력 기능을 프로그램에 추가 가능
- 클래스 정의 문법 기억
1. 배열
1-1. 배열
- 같은 자료형의 원소를 정해진 개수만큼 가지고 있는 객체 (원소들의 묶음)
- 배열의 크기는 선언할 때가 아닌 배열이 초기화 또는 생성될 때 정해짐
- 숫자 인덱스(첨자) 사용해 특정 원소를 다룸
- 배열의 선언
- 선언할 때 크기 지정 불가
- 형식
- 자료형[ ] 변수이름;
- 자료형 변수이름[ ];
ex)int[ ] a;
int b[ ]; // 1차형 배열
ex)int[ ][ ] c;
int d[ ][ ];
int[ ] e[ ]; // 2차형 배열
ex)int f[10]; // 오류
- 대표적인 참조형(클래스, 인터페이스, 배열)
- 배열 원소에 대한 주소값만 가지고 있음
- 실제 데이터가 들어갈 공간 할당 받아 사용
1-2. 배열의 초기화
- 선언과 동시에 중괄호 이용해 초기 값 지정
- 자동으로 메모리 공간 확보
- 초기화 또는 생성 과정 거쳐야 배열의 원소 사용 가능
ex)int a[] = {2, 3, 5, 7, 11}; // 선언과 동시에 초기화
ex)int anArray[][] = { {1, 2, 3}, {4, 5, 6} };
ex)int b[];
b = {4, 5, 6}; // 오류
1-3. 배열의 생성
- 배열의 원소가 사용할 메모리 공간 생성
new
연산자 이용- 배열의 크기 정하고 메모리 공간 확보
new
연산자는 메모리의 주소값 리턴- 원소가 숫자인 경우 0, 참조형인 경우 null로 자동 초기화
ex)int a[ ] = newint[3];
//선언과 생성
ex)int b[ ];
b = newint[10];
ex)int anArray4[ ][ ] = newint[3][2];
1-4. 배열의 크기
- 배열은 크기를 가지는 내장 속성
length
가지고 있음1 2 3 4 5 6 7 8
public class ArrayTest { 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
2. 문자열
2-1. String 클래스
- String 클래스는 문자열을 표현하고 처리하기 위한 참조형
- String형의 변수는 참조형이나 기본형 변수처럼 사용 가능
- 참조형 변수는 선언 후 new 연산자 이용해 실제 데이터 들어갈 공간 할당 받아 써야함
- 문자열 리터럴
- 이중 따옴표를 사용
ex) String s1 = “Java”; // 기본형 변수처럼 사용 가능
ex) String s2 = new String(”Java”); // 생성자 사용 - 참조형 변수에는 null이라는 특별한 값 지정 가능
- if (s1 != null ) { … }
- 이중 따옴표를 사용
2-2. 문자열의 + 연산자
- 두 문자열을 연결하는 것
- (문자열 + 기본형) or (문자열 + 다른 참조형)도 가능
+
연산자 사용 시 기본형 또는 다른 참조형 값은 문자열로 자동 형변환 가능
print()
나println()
에서 자주 사용- 1개 매개변수를 문자열로 바꿔 출력함
System.out
은 화면 출력을 위한 객체1 2 3
System.out.println("result=" + " " + result); System.out.println('A'+ 0); //65 System.out.println("A" + 0);
3. Scanner 클래스와 입출력
3-1. Scanner 클래스
- 키보드(표준 입력)나 파일로부터 다양한 자료 입력 받을 때 사용
- 기본적으로 공백 문자로 구분되는 단어 단위로 입력
- 문자열이나 기본형 값의 입력 위해 nextXXX( ) 입력 메소드 제공
ex)next() // 단어 입력
ex)nextInt() // 단어 int 값으로 해석
- 클래스에 관한 API 설명 페이지
- 키보드에서 입력을 받는 Scanner 객체
System.in
이용해 Scanner 객체 만들고 사용1 2
Scanner sc = new Scanner(System.in); // 인자로 표준 입력 이용해 객체 생성 String name = sc.next(); // 객체 변수로 단어 입력 받음
3-2. Scanner 클래스를 사용한 입력
- Scanner 클래스의 입력용 메소드
1 2
Scanner s = new Scanner(System.in); String name = s.next();
1 2 3 4 5 6 7 8 9 10
import java.util.Scanner; public class ScannerDemo2{ 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();
- 한 문장으로 된 문자열 입력
4. 클래스 정의
4-1. 클래스 정의 문법
- 클래스 접근 제어자
- 클래스 사용 시 어디서 접근 가능한지 지정
- 생략,
public
,protected
,private
- 클래스 비접근 제어자
abstract
,final
abstract
클래스는 상속 가능,final
클래스는 상속 불가능
- 클래스 정의 문법
1 2 3 4 5 6 7
[접근 제어자] class 클래스이름 [extends 부모클래스이름] [implements 인터페이스 이름] { // 클래스 정의 데이터 필드 선언 생성자 선언 메소드 선언 }
4-2. 클래스의 정의와 사용
- 클래스 정의
- 데이터 필드와 메소드 정의
- 객체가 가지는 인스턴스 변수와 인스턴스 메소드
- 클래스가 가지는 클래스 변수(static 변수, 정적 변수)와 클래스 메소드
- 객체의 상태는 데이터 필드로, 행위는 메소드로 구현됨
- 메소드는 저장된 데이터를 이용해 기능 수행
- 데이터 필드와 메소드 정의
- 클래스의 사용
- 클래스형 변수를 선언할 때
- 클래스는 객체의 자료형
ex)Circle c;
- 클래스는 객체의 자료형
- 객체를 생성할 때
ex)c = new Circle();
ex)s = new String();
- 상속받아 클래스를 정의할 때
- 클래스형 변수를 선언할 때
4-3. 클래스의 접근 제어자
- 클래스 접근 제어자의 의미
- 클래스를 사용할 수 있는 범위를 제한하는 것
private
과protected
는 특별한 경우에만 사용- 클래스 내부에 클래스 정의 할 경우 사용
- 접근 제어자가 생략된 경우와 public class
- 클래스 선언에서 접근 제어자가 생략된 class
- 같은 패키지에 있는 다른 클래스에서 사용 가능
- 패키지 접근 수준
- public class로 선언된 경우
- 모든 클래스에서 즉, 어디서나 사용 가능
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
public class CircleArea2 { 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( )); } }
- 모든 클래스에서 즉, 어디서나 사용 가능
- 클래스 선언에서 접근 제어자가 생략된 class
4-4. 데이터 필드의 접근 제어자
- 클래스 정의에서 데이터 필드나 메소드를 정의할 때도 접근 제어자를 사용
- 데이터 필드를 사용할 수 있는 범위를 제한하는 것(정보 은닉)
- 메소드의 접근 제어자도 의미가 같음
- 데이터 필드 접근 제어자의 의미
- private 필드는 같은 클래스에서만 사용 가능
- 접근 제어자가 생략된 필드는 같은 패키지에 있는 다른 클래스에서 사용 가능
- protected 필드는 같은 패키지와 상속 관계에 있는 자식 클래스에서 사용 가능
- public 필드는 모든 클래스에서 사용 가능
- 아래 4개의 클래스에서 Alpha 클래스의 어떤 멤버를 사용할 수 있는가?
학습 정리
- 배열은 선언 후에 초기화 과정이나 생성 과정을 거쳐야만 사용 가능
- 배열이름.length 사용해 배열 크기 표현 가능
- 문자열 변수나 리터럴에 대해 + 연산을 적용한 결과는 두 문자열이 연결된 문자열
- Scanner 클래스 이용하면 키보드나 파일로부터 편리하게 문자열(또는 기본형 값)을 입력 받을 수 있음
- 클래스를 정의할 때, 특별한 경우가 아니면 클래스의 접근 제어자로서 생략과 public만 지정 가능
- 클래스를 정의할 때, 접근 제어자가 생략된 데이터 필드는 해당 클래스와 같은 패키지의 다른 클래스에서 사용 가능
연습문제
Q1.
1
2
3
// 다음 중 문법적으로 올바른 문장은 무엇인가?
int[ ][ ] c = new int[5][ ];
Q2.
1
2
3
// int형 변수 i와 j의 값을 각각 출력하기 위해 적당한 출력문은 무엇인가?
System.out.println( i + " " + j );
Q3.
1
2
3
4
5
// Alpha 클래스에서 protected 데이터 필드가 정의되었다고 가정할 때, 아래 4개의 클래스 중에서 이 데이터 필드를 사용할 수 없는 클래스는 무엇인가?
// Package One - Alpha, Beta
// Package Two - AlphaSub(Alpha Subclass), Gamma
// Gamma