다차원 배열 - 이가현
다차원 배열
•
2차원 이상의 배열을 의미하며, 배열 요소로 또 다른 배열을 가지는 배열을 의미
•
2차원 배열 → 배열 요소 1차원 배열을 가지는 배열
•
3차원 배열→ 배열 요소로 2차원 배열을 가지는 배열
•
4차원 배열→ 배열 요소로 3차원 배열을 가지는 배열
2차원 배열 선언
타입[ ] [ ] 변수이름 = new 타입 [행] [열]
→int[ ][ ] s = new int [행] [열]
2차원 배열 인덱스
score [0][0] | score [0][1] | score [0][2] |
score [1][0] | score [1][1] | score [1][2] |
score [2][0] | score [2][1] | score [2][2] |
score [3][0] | score [3][1] | score [3][2] |
2차원 배열의 메모리
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();
}
}
Java
복사
출력
과제
2차 배열 과제
풀이
클래스와 생성자, this 키워드 - 임학준
생성자
public Pizza(int s, String t)
//이때 생성자는 (int s), (String t)객체 2개를 사용한다.
Java
복사
기본생성자
public A() {
}
Java
복사
컴파일러가 기본 생성자를 넣는다.
// 수업 예제
class A{
public A(String str) { //작성 이후 더이상 A에대한 기본생성자를 만들지 않음
System.out.println(str);
}
public A() {//기본(default) 생성자
System.out.println("기본 생성자입니다.");
}
}
public class Study22 {
public static void main(String[] args) {
A a = new A("안녕하세요");
A aa = new A();
Java
복사
this
//수업 예제
public class Circle{
int radius; //일반변수
public Circle(int radius) { //매개변수
this. radius = radius;
}
double getArea() {
return 3.14*radius*radius
}
}
Java
복사
this()
//수업 예제
class Person{
String name;
String passport = "0000000";
public Person(String name) {
this.name = name;
}
public Person(String name, String passport) {
this(name); //파라미터가 한개있는 바로위 생성자 name를 호출한다
this.passport = passport;
}
}
public class Studythis {
public static void main(String[] args) {
Person Kim = new Person("김말똥");
Person hong = new Person("홍길동","0000-0000");
}
}
Java
복사
Package - 조국현
정의 및 사용 이유
•
비슷한 성격의 자바 클래스들을 모아놓은 자바의 디렉토리
•
개발 시 수십 개, 많게는 수백의 클래스를 작성할 수도 있는데 이를 정리하기 위해 사용함
•
물리적 형태는 파일 시스템의 폴더이며 클래스명이 같더라도 패키지가 다르면 다른 클래스로 인식
표기법
•
(상위패키지).(하위패키지).(클래스)
◦
도트(.)를 사용해서 위와 같이 표현
•
패키지 이름은 모두 소문자로 구성
•
인터넷 도메인 이름의 역순으로 이름을 구성
•
이름 끝에 클래스를 정의한 주체 또는 팀의 이름 추가
사용법
•
패키지와 클래스를 모두 기술
package com.mycompany;
public class Car{
com.hankook.Tire tire = new com.hankook.Tire();
}
Java
복사
•
패키지 이름이 길 경우나 클래스가 많을 경우, 패키지 이름만으로 코드가 복잡해질 수 있으므로
import 문을 사용한다.
package com.mycompany;
import com.hankook.*; // 패키지의 모든 클래스 포함
public class Car {
Tire tire = new Tire();
}
Java
복사
→ import 문의 위치는 패키지 선언과 클래스 선언 사이
→ 패키지에 클래스가 다수 있다면 *를 사용하여 클래스명을 생략하고 패키지에 속한 모든 클래스를 사용
•
이미 상위 패키지를 import 하였고, 하위 패키지를 사용하고 싶은 경우는 하위 패키지를 다시 import 해주어야 한다.
import com.mycompany.*;
import com.mycompany.project.*;
Java
복사
•
패키지 이름을 모두 써주어야 할 경우
◦
동일한 이름의 클래스가 있는 두 개 이상의 패키지를 import 할 경우 컴파일러 에러가 발생하므로 패키지 이름 전체 작성
•
(상위패키지).(하위패키지).(클래스)
◦
도트를 사용해서 위와 같이 표현
•
패키지 이름은 모두 소문자로 구성
•
인터넷 도메인 이름의 역순으로 이름을 구성
•
이름 끝에 클래스를 정의한 주체 또는 팀의 이름 추가
접근제한자와 정보 은닉 - 김상호
접근제한자란?
•
객체들의 속성이자 특징들을 대외적으로 공개하지 않기 위해 객체의 멤버들에게 접근 제한을 걸 수가 있는데 이것을 접근 제한자라고 한다.
접근제한자의 종류
•
•
•
•
접근제한자 정리
접근제한자를 사용하는 이유
•
보안 문제와 클래스간에 결합도를 낮추기 위함이다.
정보은닉이란?
•
클래스 내부에서 사용할 변수나 메서드를 private로 선언해 외부에서 클래스 내부의 정보에 접근하지 못하도록 하는 기능을 객체지향에선 정보은닉이라고 말한다.
예제 코드
public class Practice {
private int a; //은닉화
public void setA(int n){
a = n;
}
public int getA(){
return a;
}
}
Java
복사
public class Practice2 {
public static void main(String[] args) {
Practice v = new Practice();
//System.out.println(v.a); //호출불가
v.setA(100);
System.out.println(v.getA());
}
}
Java
복사
•
위와같이 getA 메소드는 public으로 지정되어 외부 클래스의 내용 참조가 가능하지만
a는 private으로 정보은닉이 되어 Practice2 클래스에서는 호출이 되지 않는다.
상속 - 김기헌
상속(Inheritance)이란?
일상생활에서 상속은 ‘뒤를 잇는다’는 의미로 흔히 생각할 수 있는 ‘부모에게 재산을 상속 받는다’등으로 쓰인다.
그렇다면 객체 지향 프로그래밍(OOP)에서 상속이란?
재산을 상속받는 것과 비슷하다. 부모(상위, 슈퍼) 클래스를 자식(하위, 서브)클래스가 물려받는다.
하지만 프로그래밍에서 상속은 자식이 부모를 선택해서 상속을 받는다.
부모(상위) 클래스를 상속받은 자식(하위) 클래스는 부모 클래스의
속성과 기능(필드와 메소드) 이용 가능하게 된다.
또한 Java언어에서는 자식 클래스가 여러 부모 클래스로부터 상속을 받을 수 없다. 즉, 단일상속만 지원한다. 하지만 1개의 부모 클래스가 여러 자식 클래스에게 상속을 해주는 것은 가능하다.
단, 부모 클래스의 접근 제어자가 private인 필드나 메소드는 상속이 불가능하고, 부모 클래스와 자식 클래스의 패키지가 다를 경우 default 접근 제어자인 경우도 상속이 불가능하다.
상속을 받을 때는 extends 키워드를 사용하여 상속 받을 수 있다.
예시
class (자식)클래스 extends (부모)클래스{}
Java
복사
public class MainClass {
public static void main(String[] args) {
ChildClass child = new ChildClass();
child.parentFunc();
child.childFunc();
}
}
Java
복사
public class ParentClass {
public ParentClass() {
System.out.println("Parent Constructor");
}
public void parentFunc() {
System.out.println("parentFunc()");
}
private void parentFunc2() {
System.out.println("private-parentFunc");
}
}
Java
복사
public class ChildClass extends ParentClass {
public ChildClass() {
System.out.println("Child Constructor);
}
public void childFunc() {
System.out.println("childFunc()");
}
}
Java
복사
결과
Parent Consturctor
Child Constructor
parentFunc()
childFunc()
Plain Text
복사
결과를 보면 상속 받은 하위 클래스인 ChildClass 객체를 선언할 때, 상위 클래스의 생성자가 먼저 실행되는 것을 알 수 있다.
하위 클래스를 생성할 때, 상속해주는 상위 클래스가 먼저 생성된다는 것을 의미한다.
그렇다면 메인 클래스에서 ParentClass의 메소드인 parentFunc2를 호출하면 어떻게 될까?
→ parentFunc2는 접근자가 private이기 때문에, 상속받은 하위 클래스라 하더라도 사용할 수 없으므로 오류가 발생하게 된다.
그렇다면 상속을 왜 사용할까?
더 좋은 프로그램을 만들기 위해서이다.
상속을 이용하면 유지보수가 더 쉽고, 중복을 줄일 수 있으며, 기존의 검증된 클래스를 이용하여 빠르고 쉽게 새로운 클래스를 만들 수 있다.
과제 - 최아영
import java.util.InputMismatchException;
import java.util.Scanner;
class Board {
private int row;
private int col;
private char[][] arr = {
{ ' ', ' ', ' ', ' ', ' ' },
{ ' ', ' ', ' ', ' ', ' ' },
{ ' ', ' ', ' ', ' ', ' ' },
{ ' ', ' ', ' ', ' ', ' ' },
{ ' ', ' ', ' ', ' ', ' ' },
};
/**
* 실행
*/
public void run() {
Scanner sc = new Scanner(System.in);
while (true) {
try {
System.out.print("행 인덱스 입력 >> ");
row = sc.nextInt();
System.out.print("열 인덱스 입력 >> ");
col = sc.nextInt();
} catch (InputMismatchException e) {
System.out.println("정수를 입력하세요.");
sc.nextLine(); // 스캐너 버퍼 지우기
continue;
}
if ((row < 0 || row > 4) || (col < 0 || col > 4)) {
System.out.println("프로그램을 종료합니다.");
break;
}
arr[row][col] = 'X';
printBoard();
}
sc.close();
}
/**
* 출력하기
*/
public void printBoard() {
System.out.println(" 0 1 2 3 4");
for (int i = 0; i < 5; i++) {
System.out.print(i + " ");
for (int j = 0; j < 5; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
}
public class BoardTest {
public static void main(String[] args) {
Board g = new Board();
g.run();
}
}
Java
복사
class Rectangle {
private int x;
private int y;
private int width;
private int height;
public Rectangle(int x, int y, int width, int height) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
}
/**
* 사각형 넓이
*/
public int square() {
return width * height;
}
/**
* 포함 여부
*/
public boolean contains(Rectangle r) {
return x <= r.x && x + width >= r.x + r.width && y <= r.y && y + height >= r.y + r.height;
}
/**
* 사각형 정보 출력
*/
public void show() {
System.out.println("사각형의 좌표는 (" + x + ", " + y + ")이고, 넓이는 " + square() + "입니다.");
}
}
public class RectangleTest {
public static void main(String[] args) {
Rectangle r = new Rectangle(2, 2, 8, 7);
Rectangle s = new Rectangle(5, 5, 6, 6);
Rectangle t = new Rectangle(1, 1, 10, 10);
r.show();
System.out.println("s의 면적은 "+s.square());
if(t.contains(r)) System.out.println("t는 r을 포함합니다.");
if(t.contains(s)) System.out.println("t는 s를 포함합니다.");
}
}
JavaScript
복사