//////
Search
🍇

[0923] 2차원 배열, 생성자, 패키지, 접근제한자,정보은닉

생성일
태그
TodayILearn
java
생성일 1
접근제한자 사용- 클래스       : public, default- 생성자       : public, protected, default, private- 멤버변수    : public, protected, default, private- 멤버메소드 : public, protected, default, private- 지역변수    : 접근제한자 사용 불허
Plain Text
복사

2차원 배열

고현석 0923
// 2차원 배열 선언 int[][] arr = new int[3][5]; // 3행5열의 크기를 가진 배열
Java
복사
2차원 배열 → 행(Row)와 열(Column)으로 이루어진 배열
위의 코드 → 3행5열의 int형 2차원 배열을 선언하는 코드
1차원 배열과 마찬가지로 선언과 동시에 초기화 됨
Primary Type → Default 값으로 초기화 (int형은 0, boolean형은 false 등등,,,)
Reference Type → null로 초기화
// 2차원 배열 초기화 public class Test { public static void main(String[] args) { int[][] arr = {{11}, {22, 33}, {44, 55, 66}}; for(int i=0 ; i<arr.length ; i++){ for(int j=0 ; j<arr[i].length ; j++){ System.out.print(arr[i][j] + "\t"); } System.out.println(); } } } /* 실행결과 * 11 * 22 33 * 44 55 66 */
Java
복사

패키지

송진우 0923
패키지란? 클래스의 묶음.
비슷한 성격의 자바 클래스들을 모아 놓은 자바의 디렉토리(폴더)
→ 클래스의 분류가 용이!
같은 클래스의 이름일지라도 다른 패키지 안이라면 존재 가능
위 그림과 같이 상위, 하위 패키지로 구별된다. . 을 통해서 표현할 수 있다. → 상위패키지.하위패키지.클래스

패키지의 종류

1. 내장 패키지
자바에서 기본적으로 내장되어 있는 패키지
2. 사용자 정의 패키지
사용자가 사용하기 위해 정의한 패키지

패키지의 선언

패키지에 소속된 클래스 파일은, 처음에 패키지 선언을 해야 한다.
package 패키지명;
Java
복사

패키지 사용

같은 패키지 내에서는 아무 조건 없이 다른 클래스 사용 가능!
다른 패키지에서는 클래스를 사용하기 위해 객체 생성
import 패키지명.클래스명; or import 패키지명.*;
Java
복사

패키지 사용 시, 유의할 점

1.
동일 이름의 클래스 파일을 같은 위치에 둘 수 없다.
2.
패키지 이름은 모두 소문자로 구성한다.
3.
인터넷 도메인 이름의 역순으로 이름을 구성한다. (권장)
4.
이름 끝에 클래스를 정의한 주체 또는 팀의 이름을 추가한다. (권장)

클래스 패스(Class Path)

송진우_0923
컴퓨터 내에 존재하는 클래스 파일을 찾아가는 방법
클래스 파일 생성 후, 임의로 클래스 파일의 위치를 다른 디렉토리로 바꿨을 때, 실행 시 클래스 파일을 찾지 못함
이를 위해, 변경된 클래스 파일의 경로를 옵션을 통해서 지정해주는 것

자바 가상 기계(JVM)가 클래스를 찾는 순서

1.
부트스트랩 클래스
자바 플랫폼을 구성하는 핵심적인 클래스
jre/lib 경로에 존재하는 rt.jar 및 기타 여러 jar 파일
2.
확장 클래스
자바 확장 메커니즘을 사용하는 클래스
확장 디렉토리에 있는 jar파일 (jre/lib/ext 내의 모든 jar파일은 확장으로 간주)
3.
사용자 클래스
확장 메커니즘을 활용하지 않는 개발자 및 타사에서 정의한 클래스
-classpath 옵션을 사용하거나 CLASSPATH 환경변수를 사용하여 식별

클래스를 찾는 방법

1.
현재 디렉토리에서 검색 (없으면 2번)
2.
환경변수인 CLASSPATH에 설정된 디렉터리에서 검색
3.
자바 가상 머신 실행 시, -classpath 옵션을 통해서 클래스 경로를 알려줄 수 있음.

-classpath 옵션

터미널 창에서 사용
java -classpath "클래스 경로" 실행파일
Java
복사

생성자

주찬민_0923
생성자(constructor) 란 객체가 생성될 때에 필드에 초기값을 제공하고 초기화를 실행하는 메소드이다.
public class Person { String name; //Public Person() {} default 생성자 public void getPersonInfo() { System.out.println("이름 : "+ name); } }
Java
복사
public class PersonTest { public static void main(String[] args) { Person personJames = new Person(); personJames.name = "James"; personJames.getPersonInfo(); } }
Java
복사
위 예시 코드는 PersonTest 클래스에서 Person 객체를 생성하고, Person 객체의 변수에 이름을 입력 및 출력하는 코드이다.
Person personJames = new Person(); 에서 Person() 과 같은 함수가 생성자이다.

기본 생성자 (디폴트 생성자)

실제로 Person 클래스에는 생성자 코드가 구현되어 있지 않다. 이러한 경우 자바 컴파일러가 자동으로 디폴트 생성자를 제공한다.
디폴트 생성자는 Public Person() {}의 형태로 제공된다.
디폴트 생성자는 매개변수가 없고 변수를 초기화하지 않는다.

생성자 만들기

public class Person { String name; // 첫 번째 생성자 public Person() {} // 두 번째 생성자 public Person(String name){ this.name = name; // this에 대한 설명은 아래 문단에 기록 } public void getPersonInfo() { System.out.println("이름 : "+ name); } }
Java
복사
public class PersonTest { public static void main(String[] args) { Person personJames = new Person("James"); //두 번째 생성자 호출 personJames.getPersonInfo(); Person personHarry = new Person(); //첫 번째 생성자 호출 personHarry.name = "Harry"; person.James.getPersonInfo(); } }
Java
복사
Person 클래스에 두 가지 생성자를 만들었다. 하나의 클래스에 생성자를 두 개 이상 구현하는 것을 “생성자 오버로드(constructor overload)”라고 한다.
첫 번째 생성자는 디폴트 생성자와 동일하다.
두 번째 생성자는 String name을 매개변수로 갖는다. PersonTest 클래스의 main 함수에서 “James”를 인자로 받으면, 두 번째 생성자 호출되어 기능을 수행한다.

this 예약어

현재 객체가 스스로를 가리키는 예약어이다.
this는 객체를 가리키는 참조 변수와 같이 특정한 메모리 주소값을 갖는다.
아래의 코드를 실행하면 동일한 주소값이 출력된다.
public class Person { String name; public Person() {} public Person(String name){ this.name = name; } public void printThis() { System.out.println(this); }
Java
복사
public class PersonTest { public static void main(String[] args) { Person personJames = new Person("James") System.out.println(perJames); personJames.printThis(); } }
Java
복사

this의 활용

this는 생성자에서 매개변수의 이름과 필드 이름이 동일한 경우에 혼동을 막기 위해서 주로 사용된다.
this는 다른 생성자를 호출할 때 사용할 수 있다.

활용 1 예시

public class Person { String name; // 첫 번째 생성자 public Person() {} // 두 번째 생성자 public Person(String name){ this.name = name; // this에 대한 설명은 아래 문단에 기록 } public void getPersonInfo() { System.out.println("이름 : "+ name); } }
Java
복사
public class PersonTest { public static void main(String[] args) { Person personJames = new Person("James"); //두 번째 생성자 호출 personJames.getPersonInfo(); } }
Java
복사
PersonTest 클래스에서 Person personJames = new Person("James"); 의 코드로 두 번째 생성자를 호출하면, 두 번째 생성자의 매개 변수 String name은 Person 클래스의 필드 String name과 혼동될 수 있다.
이를 방지하고자

활용 2

public class Person { String name; // 첫 번째 생성자 public Person() { this.(""); } // 두 번째 생성자 public Person(String name){ this.name = name; // this에 대한 설명은 아래 문단에 기록 } public void getPersonInfo() { System.out.println("이름 : "+ name); } }
Java
복사
public class PersonTest { public static void main(String[] args) { Person personJames = new Person("James"); //두 번째 생성자 호출 personJames.getPersonInfo(); Person personHarry = new Person(); //첫 번째 생성자 호출 personHarry.name = "Harry"; person.James.getPersonInfo(); } }
Java
복사
PersonTest 클래스에서 Person personHarry = new Person(); 의 코드로 첫 번째 생성자를 호출하면, 첫 번째 생성자가 실행된다. 이때 this.(””); 는 Person(””); 과 같은 의미가 되어 매개변수를 가진 생성자를 다시 호출한다.

생성자 예제

this 예약어를 활용하여 다음의 결과가 출력되는 TV 클래스를 만드시오
public class TVTest { public static void main(String[] args) { TV myTV = new TV("LG", 2017, 32); myTV.show(); } } // 출력 결과 : LG에서 만든 2017년형 32인치 TV
Java
복사
예시 답안
public class TV { String brand; int productionYear; int inch; public TV (String brand, int productionYear, int inch) { this.brand = brand; this.productionYear = productionYear; this.inch = inch; } public void show() { System.out.println(brand + "에서 만든 " + productionYear + "년형 " + inch + "인치 TV"); } }
Java
복사

접근제한자

장진선_0923
객체 지향에서 정보 은닉(data hiding)이란 사용자가 굳이 알 필요가 없는 정보는 사용자로부터 숨겨야 한다는 개념이다. 이러한 정보은닉을 위해 접근 제한자라는 기능을 제공한다.

접근 제한자

클래스 내부 또는 외부에서 메소드나 필드에 접근 하는 것을 제어하는 역할
접근제한자는 생략 가능하며 생략할 경우 자동으로 default 설정
접근제한자 사용될 수 있는 곳 : 클래스, 변수, 생성자, 메서드
접근 제한자의 종류
public : 모든 접근을 허용
protected : 같은 패키지(폴더)에 있는 객체와 상속관계의 객체들만 허용
default : 같은 패키지(폴더)에 있는 객체들만 허용
private : 현재 객체 내에서만 허용
밑으로 내려갈수록 접근 제한이 강화 됨
접근 제한자 사용 가능 범위
public
protected
default
private
클래스
O
O
필드
O
O
O
O
생성자
O
O
O
O
메소드
O
O
O
O
접근 가능 대상
모든 대상
같은 패키지 or 자식 클래스
같은 패키지의 클래스
클래스 내부

정보 은닉

정상희
객체지향 4가지 특성 중 하나

정보은닉 개념

다른 클래스에서 자신의 정보를 숨기고 자신의 연산만을 통하여 접근을 허용한다.
Java
복사
장점
외부 객체가 특정 객체의 데이터 및 함수에 직접 접근할 경우 발생할 수 있는 오류를 최소화 할 수 있다. 무결성 보장
객체의 독립성이 유지된다.
처리된 getter(), setter()를 사용하므로 객체의 이식성이 좋다.
코드 작성 시 기억할 점1) 클래스 안에서 변수선언을 할 때 무조건
int numerator; int denominator;
private int numerator; private int denominator;
1) 클래스 안에서 변수 선언을 할 때 무조건 private 접근 지정자를 넣는다.
2) 변수마다 getter(), setter()함수를 작성하여 로직을 처리한다.
예시
분수의 값을 계산하는 코드를 작성했다.
정보 은닉을 사용하지 않은 코드일 경우, 외부에서 입력한 값을 그대로 받기 때문에 문제가 될 수 있다.
만약 분모 변수, 분자 변수에 0이 들어간다면, 더 이상 분수로 정의할 수 없다.
class Fraction { int numerator; //분자 int denominator; //분모 public Fraction(int numerator,int denominator) { this.numerator = numerator; this.denominator = denominator; } public void fracValue() { double value = numerator/denominator; } } public class fraction_InformHiding { public static void main(String[] args) { Fraction me = new Fraction(3, 0); me.show(); } }
Java
복사
정보 은닉 개념 추가
class Fraction { private int numerator; // 분자 private int denominator; // 분모 public Fraction(int n, int d) { setNumerator(n); setDenominator(d); } public void setNumerator(int n) { // 분자 값 검사 if (n == 0) { numerator = 0; // 변경 가능 return; } numerator = n; } public void setDenominator(int d) { // 분모 값 검사 if (d == 0) { denominator = 0; return; } denominator = d; } public int getNumerator() { return numerator; } public int getDenominator() { return denominator; } public double getValue() { return (double) numerator / denominator; } } public class fraction_InformHiding { public static void main(String[] args) { Fraction me = new Fraction(3, 7); me.setDenominator(9); // 분모에 9를 넣었다 -> 0.3333.. System.out.println(me.getValue()); me.setDenominator(0); // 분모에 0을 넣었다 -> INFINTY System.out.println(me.getValue()); me.setNumerator(0); // 분자에 0을 넣었다 -> NaN System.out.println(me.getValue()); // me.denominator = 0; // 데이터 직접 접근 불가 -> 에러 } }
Java
복사