[220923] 2D 배열, 생성자, 패키지, 접근 제어자

300mm·2022년 9월 23일
0
post-thumbnail

2차원 배열

1차원 배열의 선언

int[] arr = new int[3]

메모리 그림

2차원 배열 선언과 초기화

// 자료형[][] 참조변수 = new 자료형[행의 개수][열의 개수]
int[][] arr = new int[2][3]

arr = {
	{11, 22, 33},
	{44, 55, 66}
};

메모리 그림

  • 2차원 배열의 선언시 메모리 구조

  • 2차원 배열 초기화시 메모리 구조

2차원 배열 접근

//참조변수[행 번호][열 번호]
//배열의 시작은 항상 '0' !!
int i = arr[0][2];

// i = 33

반복문을 사용한 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();
   }
}
  • 반복문에 의해 접근되는 순서

생성자

생성자의 이해

생성자란?

  • 객체가 생성될 때에 필드에 초기값을 제공하고 초기화 절차를 실행하는 메소드
Car car = new Car()

생성자 함수 : 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+",)");
	}
}

기본 생성자

  • 매개변수가 없는 생성자
  • 생성자가 하나도 없을 때만, 컴파일러가 자동추가
class Pizza {
	int size;
	String type;
}

public class PizzaTest {
	public static void main(String[] args) {
		Pizza obj1 = new Pizza(); // 컴파일러가 자동으로 만들어준 기본생성자가 있기 때문에 가능
	}
}
  • 개발자는 생성자가 있으면 웬만하면 꼭 직접 기본 생성자를 추가하자!
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, "포테이토");
	}
}

this에 대한 이해

this

  • this는 현재 객체 자신을 가리키는 참조 변수이다.
  • this는 컴파일러에서 자동으로 생성한다.
  • 흔히 생성자에서 매개 변수 이름과 필드 이름이 동일한 경웨 혼동을 막기 위해서 사용한다.
public class Circle {
	int radius;

	public Circle(int radius) {
		this.radius = radius;
	}
	
	double getArea() {
		return 3.14 * radius * radius
	}
}

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;
    }
}

클래스와 객체 문제

  • 다음 main() 메소드를 실행하였을 때 예시와 같이 출력되도록 TV 클래스를 작성하라.
public static void main(String[] args) {
   Tv myTv = new Tv("LG", 2017, 32); //LG에서 만든 2017년 32인치
   myTv.show();
}
LG에서 만든 2017년형 32인치 TV

코드

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();
    }
}
  • 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();
}

코드

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();
    }
}
  • 노래 한 곡을 나타내는 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();
          }
      }

패키지

패키지에 대한 이해

  • 패키지는 비슷한 성격의 자바 클래스들을 모아 놓은 자바의 디렉토리
  • 패키지를 사용하면 비슷한 성격의 클래스들끼리 묶을 수 있어 클래스의 분류가 용이
  • 같은 이름의 클래스 일지라도 서로 다른 패키지에 존재하는 것이 가능
    • 자신만의 패키지 체계를 유지함으로써 다른 개발자가 개발한 클래스 라이브러리의 클래스와 이름이 충돌하는 것을 피할 수 있다.
  • String 클래스의 실제 이름(full name)은 java.lang.String 이다.
    • java.lang 패키지에 속한 String 클래스라는 의미

패키지 종류

  • 내장 패키지 👉 고슬링 아저씨가 짜준거
  • 사용자 정의 패키지 👉 내가 짠거

패키지의 선언

package 패키지명;
  • 소스파일에서 주석과 공백을 제외한 첫 번째 문장에 선언해야 한다.
  • 하나의 소스파일에 단 한 번만 선언될 수 있다.

Import

  • import문을 선언하면 다른 패키지의 클래스를 사용할 때 패키지 이름을 생략할 수 있다.
  • 패키지문과 클래스 선언 사이에 선언한다.
import 패키지명.클래스명;
import 패키지명.*; //패키지 아래 모든 클래스 사용

static import

  • static 멤버를 호출할 때 클래스 이름을 생략할 수 있다
  • 특정 클래스의 static 멤버를 자주 사용할 때 사용

가상 기계가 클래스를 찾는 3가지 방법

  1. 첫 번째로 가상 기계는 현재 디렉토리부터 찾는다.
  2. 일반적으로는 환경 변수인 CLASSPATH에 설정된 디렉토리에서 찾는다.
  3. 가상 머신을 실행할 때 옵션 -classpath를 사용할 수 있다.
    • 가상 머신을 실행할 때, 클래스 경로는 직접 알려주는 것

접근 제어자

접근 제어자가 사용될 수 있는 곳

  • 클래스, 멤버변수, 메서드, 생성자

접근 범위

private같은 클래스 내에서만 접근이 가능
(default)같은 패키지 내에서만 접근이 가능
protected같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능
public접근 제한이 전혀 없다.

제어자같은 클래스같은 패키지자손 클래스전체
public
protected
(default)
private
  • 예시

    • 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());
    }
}

0개의 댓글