접근제한자 사용- 클래스 : 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
복사