2차원 배열
1차원 배열의 선언
int[] arr = new int[3]
Plain Text
복사
메모리 그림
2차원 배열 선언과 초기화
// 자료형[][] 참조변수 = new 자료형[행의 개수][열의 개수]
int[][] arr = new int[2][3]
arr = {
{11, 22, 33},
{44, 55, 66}
};
Plain Text
복사
메모리 그림
•
2차원 배열의 선언시 메모리 구조
•
2차원 배열 초기화시 메모리 구조
2차원 배열 접근
//참조변수[행 번호][열 번호]
//배열의 시작은 항상 '0' !!
int i = arr[0][2];
// i = 33
Plain Text
복사
반복문을 사용한 2차원 배열 초기화와 접근
public static void main(String[] args) {
int[][] arr = new int[3][4];
int num = 1;
// 배열에 값을 저장
for(int i = 0; i < 3; i++) { // 행
for(int j = 0; j < 4; j++) { // 열
arr[i][j] = num;
num++;
}
}
// 배열에 저장된 값을 출력
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 4; j++) {
System.out.print(arr[i][j] + "\\t");
}
System.out.println();
}
}
Plain Text
복사
•
반복문에 의해 접근되는 순서
생성자
생성자의 이해
생성자란?
•
객체가 생성될 때에 필드에 초기값을 제공하고 초기화 절차를 실행하는 메소드
Car car = new Car()
Plain Text
복사
생성자 함수 : Car()
생성자 특징
1.
return, void 안붙임
2.
클래스 이름과 함수이름이 같음
3.
모든 클래스는 반드니 생성자가 필요하다.
생성자 예제
class Pizza {
int size;
String type;
public Pizza() { // 생성자
size = 12;
type = "슈퍼슈프림";
}
public Pizza(int size, String type) { // 생성자
this.size = size;
this.type = type;
}
}
public class PizzaTest {
public static void main(String[] args) {
Pizza obj1 = new Pizza();
System.out.println("("+obj1.type+ " , "+obj1.size+",)");
Pizza obj2 = new Pizza(24, "포테이토");
System.out.println("("+obj2.type+ " , "+obj2.size+",)");
}
}
Plain Text
복사
기본 생성자
•
매개변수가 없는 생성자
•
생성자가 하나도 없을 때만, 컴파일러가 자동추가
class Pizza {
int size;
String type;
}
public class PizzaTest {
public static void main(String[] args) {
Pizza obj1 = new Pizza(); // 컴파일러가 자동으로 만들어준 기본생성자가 있기 때문에 가능
}
}
Plain Text
복사
•
개발자는 생성자가 있으면 웬만하면 꼭 직접 기본 생성자를 추가하자!
class Pizza {
int size;
String type;
public Pizza() {} // 기본 생성자
public Pizza(int size, String type) { // 생성자
this.size = size;
this.type = type;
}
}
public class PizzaTest {
public static void main(String[] args) {
Pizza obj1 = new Pizza();
Pizza obj2 = new Pizza(24, "포테이토");
}
}
Plain Text
복사
this에 대한 이해
this
•
this는 현재 객체 자신을 가리키는 참조 변수이다.
•
this는 컴파일러에서 자동으로 생성한다.
•
흔히 생성자에서 매개 변수 이름과 필드 이름이 동일한 경웨 혼동을 막기 위해서 사용한다.
public class Circle {
int radius;
public Circle(int radius) {
this.radius = radius;
}
double getArea() {
return 3.14 * radius * radius
}
}
Plain Text
복사
this() 함수
•
this() 다른 생성자를 의미
•
this() 다른 생성자를 호출 할 때 쓰인다.
•
한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.
•
코드가 더 간결해지고 유지보수면에서 장점이 있다.
class Car{
String color;
String gearType;
int door;
// 기본 옵션
Car() {
this("black", "auto", 4);
// this.color = "black";
// this.gearType = "auto";
// this.door = 4;
}
// 색상 옵션 추가
Car(String color) {
this(color, "auto", 4);
// this.color = color;
// this.gearType = "auto";
// this.door = 4;
}
// 색상, 문 옵션 추가
Car(String color, int door) {
this(color, "auto", door);
}
// 풀옵션
Car(String color, String gearType, int door) {
this.color = color;
this.gearType = gearType;
this.door = door;
}
}
Plain Text
복사
클래스와 객체 문제
•
다음 main() 메소드를 실행하였을 때 예시와 같이 출력되도록 TV 클래스를 작성하라.
public static void main(String[] args) {
Tv myTv = new Tv("LG", 2017, 32); //LG에서 만든 2017년 32인치
myTv.show();
}
LG에서 만든 2017년형 32인치 TV
Plain Text
복사
코드
class Tv{
private String brand;
private int year;
private int inch;
public Tv(String brand, int year, int inch) {
this.brand = brand;
this.year = year;
this.inch = inch;
}
void show() {
System.out.println(brand + "에서 만든 " + year + "년형 " + inch + "인치 TV");
}
}
public class TelevisionEx {
public static void main(String[] args) {
Tv myTv = new Tv("LG", 2017, 32);
myTv.show();
}
}
Plain Text
복사
•
Grade 클래스를 작성해보자. 3 과목의 점수를 입력받아 Grade 객체를 생성하고 성적 평균을 출력하는 main()과 실행 예시는 다음과 같다.
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
System.out.print("수학, 과학, 영어 순으로 3개의 정수 입력 >> ");
int math = sc.nextInt();
int science = sc.nextInt();
int english = sc.nextInt();
Grade me = new Grade(math, science, english);
System.out.println("평균은 "+me.average()); // average()는 평균을 계산하여 리턴
sc.close();
}
Plain Text
복사
코드
import java.util.Scanner;
class Grade{
private int math;
private int science;
private int english;
public Grade() {}
public Grade(int math, int science, int english) {
this.math = math;
this.science = science;
this.english = english;
}
public double average() {
return (double)(math+science+english) / 3;
}
}
public class GradeClassTest {
public static void main(String[] args) {
//TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
System.out.print("수학, 과학, 영어 순으로 3개의 정수 입력 >> ");
int math = sc.nextInt();
int science = sc.nextInt();
int english = sc.nextInt();
Grade me = new Grade(math, science, english);
System.out.println("평균은 "+me.average()); // average()는 평균을 계산하여 리턴
sc.close();
}
}
Plain Text
복사
•
노래 한 곡을 나타내는 Song 클래스를 작성하라. Song은 다음 필드로 구성된다.
◦
노래의 제목을 나타내는 title
◦
가수를 나타내는 artist
◦
노래가 발표된 연도를 나타내는 year
◦
국적을 나타내는 country
•
또한 Song 클래스에 다음 생성자와 메소드를 작성하라.
◦
생성자 2개: 기본 생성자와 매개변수로 모든 필드를 초기화하는 생성자
◦
노래 정보를 출력하는 show() 메소드
◦
main() 메소드에서는 1978년, 스웨덴 국적의 ABBA가 부른 "Dancing Queen"을song 객체로 생성하고 show()를 이용하여 노래의 정보를 다음과 같이 출력하라.1978년 스웨덴국적의 ABBA가 부른 Dancing Queen
코드
class Song{
private String title, artist, country;
private int year;
public Song() {
this("title", "artist", 0000, "country");
}
public Song(String title, String artist, int year, String country) {
this.title = title;
this.artist = artist;
this.year = year;
this.country = country;
}
public void show() {
System.out.println(year+"년 "+country+"국적의 "+artist+"가 부른 "+title);
}
}
public class SongPlayer {
public static void main(String[] args) {
Song song = new Song("Dancing Queen","ABBA",1978,"스웨덴");
song.show();
}
}
Plain Text
복사
패키지
패키지에 대한 이해
•
패키지는 비슷한 성격의 자바 클래스들을 모아 놓은 자바의 디렉토리
•
패키지를 사용하면 비슷한 성격의 클래스들끼리 묶을 수 있어 클래스의 분류가 용이
•
같은 이름의 클래스 일지라도 서로 다른 패키지에 존재하는 것이 가능
◦
자신만의 패키지 체계를 유지함으로써 다른 개발자가 개발한 클래스 라이브러리의 클래스와 이름이 충돌하는 것을 피할 수 있다.
•
String 클래스의 실제 이름(full name)은 java.lang.String 이다.
◦
java.lang 패키지에 속한 String 클래스라는 의미
패키지 종류
•
내장 패키지
고슬링 아저씨가 짜준거
•
사용자 정의 패키지
내가 짠거
패키지의 선언
package 패키지명;
Plain Text
복사
•
소스파일에서 주석과 공백을 제외한 첫 번째 문장에 선언해야 한다.
•
하나의 소스파일에 단 한 번만 선언될 수 있다.
Import
•
import문을 선언하면 다른 패키지의 클래스를 사용할 때 패키지 이름을 생략할 수 있다.
•
패키지문과 클래스 선언 사이에 선언한다.
import 패키지명.클래스명;
import 패키지명.*; //패키지 아래 모든 클래스 사용
Plain Text
복사
static import
•
static 멤버를 호출할 때 클래스 이름을 생략할 수 있다
•
특정 클래스의 static 멤버를 자주 사용할 때 사용
가상 기계가 클래스를 찾는 3가지 방법
1.
첫 번째로 가상 기계는 현재 디렉토리부터 찾는다.
2.
일반적으로는 환경 변수인 CLASSPATH에 설정된 디렉토리에서 찾는다.
3.
가상 머신을 실행할 때 옵션 -classpath를 사용할 수 있다.
•
가상 머신을 실행할 때, 클래스 경로는 직접 알려주는 것
접근 제어자
접근 제어자가 사용될 수 있는 곳
•
클래스, 멤버변수, 메서드, 생성자
접근 범위
<br>
•
•
예시
◦
default 패키지인 경우 다른 패키지에서 import 할 수 없음
◦
클래스는 public, 생성자는 default 라면 다른 패키지에서 import는 가능해도 default 생성자는 호출 불가능
접근 제어자를 사용하는 이유
•
외부로부터 데이터를 보호하기 위해서
•
외부에는 불필요한, 내부적으로만 사용되는, 부분을 감추기 위해서
정보은닉
•
인스턴스 변수는 private 으로 하여 외부에서 접근하지 못하도록 하고, 메서드는 public으로 하여 직접 접근은 막고 메서드를 통한 간접 접근 허용
•
외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위해서
•
접근자에서 매개 변수를 통하여 잘못된 값이 넘어오는 경우, 이를 사전에 차단할 수 있다.
class Circle {
private double rad = 0;
final double PI = 3.14;
public Circle(double rad) {
setRad(rad);
}
public double getRad() {
return rad;
}
public void setRad(double rad) {
if(rad<0) {
this.rad=0;
return;
}
this.rad = rad;
}
public double getArea() {
return PI*rad*rad;
}
}
public class CircleTest {
public static void main(String[] args) {
Circle c = new Circle(1.5);
System.out.println(c.getArea());
c.setRad(2.5);
System.out.println(c.getArea());
c.setRad(-3.3);
System.out.println(c.getArea());
// c.rad = -4.5; // 컴파일 오류로 이어짐
// System.out.println(c.getArea());
}
}
Plain Text
복사
private | 같은 클래스 내에서만 접근이 가능 |
(default) | 같은 패키지 내에서만 접근이 가능 |
protected | 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능 |
public | 접근 제한이 전혀 없다. |
제어자 | 같은 클래스 | 같은 패키지 | 자손 클래스 | 전체 |
public | ||||
protected | ||||
(default) | ||||
private |