JAVA 17(2) 인터페이스의 기본 접근 지정자
·
Programming/Java
인터페이스의 추상 메소드는 public이다. 접근 지시자를 표시하지 않아도 인터페이스만은 default가 아닌 public으로 인식한다. 인터페이스에 인스턴스 변수를 선언할 수 없다. 따라서 접근 지시자 없이 변수가 선언됐다면 그 것은 인스턴스 변수가 아니라 상수(public static final인 이유)이다. 인터페이스가 상속이 필요한 이유 만약 기존 인터페이스에 새로운 메소드를 추가한다면 어떤 문제가 발생할까? 예제에서는 컬러 출력 메소드가 인터페이스에 추가되었다. 삼성 프린터에서 컬러 출력 메소드가 필요 없어도 이미 인터페이스에는 메소드가 추가 됐으므로 컬러 출력 메소드를 귀찮더라도 구현해야 한다. 왜냐하면 인터페이스 구현하는 클래스는 해당 인터페이스의 모든 추상 메소드를 구현해야 되기 때문이다...
JAVA 17(1) 인터페이스
·
Programming/Java
프로그래밍에서 말하는 인터페이스 인터페이스= 통신방법 도구/수단 인터페이스를 정의할 때 메소드는 몸체를 갖지 않는다. 이런 메소드를 추상 메소드라고 한다. 인터페이스는 클래스가 아니기 때문에 인스턴스를 생성할 수 없다. implements 키워드를 통해 클래스에서 인터페이스는 구현될 뿐이다. 인터페이스형 참조변수는 인터페이스를 구현한 클래스의 인스턴스를 참조 할 수 있다. 인터페이스는 메소드 구현체가 없으므로 메소드 오버라이딩한 것은 아니지만, 메소드의 호출 관계에서는 오버라이딩 관계가 성립한다. 따라서, @Override을 쓸 수 있다. 만약 Printer에 print메소드 뿐만 아니라 수 많은 메소드가 존재하고, 개발자는 print 추상 메소드를 제공하는 Printable인터페이스를 만들었다고 가정하..
JAVA 16 상속이 도움 되는 상황
·
Programming/Java
상속 기반이 아닌 코드의 문제점 위의 코드는 상속을 사용하지 않은 코드이다. 인맥 관리 프로그램은 기본적으로 저장/확인 기능이 구현되어야 할 것이다. 두 클래스의 멤버 변수/메소드가 서로 다르므로 저장/확인 구현도 각각 구현해야 할 것이다. 하지만 이러한 클래스 디자인 기반해서 관리 대상이 늘어난다면 그 만큼 코드 수도 늘어나 복잡해질 것이다. 상속 기반의 문제 해결 ComFriend와 UnivFriend은 분명 다른 클래스지만, Friend가 두 클래스를 상속하게 만듦으로 인해 두 클래스에 공톡적인 규칙과 규약을 적용하게 된다. 여기서 말하는 규칙과 규약은 상위클래스(Friend)이다. 상위클래스 참조변수로 각각의 하위클래스 인스턴스를 참조한 상황이다. 보시다시피 배열이 하나니까 저장하는 방법도 하나로..
JAVA 15 오버라이딩
·
Programming/Java
상속을 위한 두 클래스의 관계 하위 클래스는 상위 클래스의 모든 특성(변수, 메소드)을 지닌다. 상속 관계에 있는 두 대상은 IS-A 관계를 가져야 한다. IS-A관계란 A is a B의 관계로, A는 일종의 B라는 의미를 가진다. 예를 들어 "사과는 일종의 과일이다"처럼 실제 관계를 가진 대상끼리 상속(extends) 해야 한다. 만약 코드 상 지우개라는 클래스가 노트북이라는 클래스에 상속(extends)됐다고 가정해보면, 문법적으로 오류는 없지만 IS-A관계가 성립하지 않으므로 상속을 사용하면 안된다. IS-A 관계는 상속을 위한 일종의 규칙이다. 메소드 오버라이딩 상위 클래스 참조변수(ph2)는 하위 클래스 인스턴스(SmartPhone)을 참조 가능하지만, 하위 클래스의 변수/메소드에 접근할 수 없..
JAVA 14 상속
·
Programming/Java
상속의 치명적 오해 코드의 재활용을 위한 문법이다 (X) 중요! 연관된 일련의 클래스들(다른 클래스들)에 대해 상속을 적용하면, 공통적인 규약/규칙을 정의/적용 할 수 있다. (O) 상속의 멤버 접근 class Man{ private String name; void setName(String name){ this.name=name; } String getName(){ return this.name; } public void tellMyName(){ System.out.println("my name is "+ name); } } 멤버를 초기화할 때, 이상적인 원칙은 그 클래스의 멤버는 해당 클래스의 생성자에서 초기화시켜주는 것이다(생성자를 통한 초기화 원칙). 하지만 아래의 예제에서는 상위 클래스 Man의..
JAVA 13 1차원 배열의 이해와 활용
·
Programming/Java
1차원 배열이란? 타입이 같은 둘 이상의 데이터를 저장할 수 있는 1차원 구조의 메모리 공간 1차원 배열 선언 int[] ref=new int[5] //ref는 int형 배열을 참조할 수 있는 참조변수다 new로 짐작할 수 있는 것! int[] ref=new int[5] //ref는 int형 배열을 참조할 수 있는 참조변수다 배열의 요소는 반복문을 통해 순차적 접근이 가능하며, 이것은 배열이 가진 큰 장점 중 하나이다. 배열의 초기화 메소드 기본자료형 배열은 모든 요소가 0으로 초기화되고, 인스턴스 배열(참조변수 배열)은 모든 요소가 null로 초기화된다. 그럼 초기화 설정을 하려면 어떻게 해야할까? 배열의 초기화 메소드를 알아보자! 배열 복사 메소드 enhanced for문(for-each 문) 2차원..
JAVA 12 toString 메소드
·
Programming/Java
모든 클래스는 toString 메소드를 가지고 있다. println 또는 print에 인스턴스 참조 값이 전달되면 해당 참조 값이 참조하는 인스턴스의 toString 메소드가 반환하는 문자열을 출력한다. Scanner 클래스 콘솔 입력 받은 데이터를 다양한 타입으로 변환하여 리턴하는 클래스이다. 스캔할 대상이 파일뿐만 아니라 키보드, 스트링 인스턴스가 될 수 있다. Scanner의 장점 중 하나는 Scanner 인스턴스 생성 이후에 데이터를 스캔하는 방법에 있어서는 차이가 없다는 것이다. next() 메소드는 스페이스 즉 공백 전까지 입력받은 문자열을 리턴한다. Scanner 인스턴스 생성 이후, 데이터를 스캔하는 방법에 있어서는 차이가 없다. 즉, 연결 대상에 의존적이지 않은 코드 작성이 가능하다. i..
JAVA 11 오버로딩
·
Programming/Java
호출된 메소드를 참조할 때 참조하게 되는 두가지 정보 - 메소드의 이름 - 메소드의 매개변수 정보 따라서, 이 둘 중 하나의 형태가 다른 메소드를 정의하는 것이 가능하다. class MyHome{ void mySimpleHome(int n){...} void mySimpleHome(int n1, int n2){...} void mySimpleHome(int n1, int n2, int n3){...} //메소드 오버로딩 } String 클래스 String 인스턴스는 Immutable(불변) 인스턴스이다. Immutable는 생성 이후 값의 변경을 허용하지 않음을 의미한다. JVM은 새 인스턴스의 문자열(str2)을 확인하고 이미 같은 문자열 인스턴스(str1)가 있으면 기존 인스턴스의 참조값을 리턴한다...
JAVA 10 static이란?
·
Programming/Java
static 변수= 클래스 변수 클래스 변수는 클래스의 인스턴스가 얼마나 존재하는지 관계 없이, 하나의 사본이 존재하는 클래스에 정의된 변수이다. 클래스 변수는 인스턴스 변수가 아님을 주의하자. 선언된 모든 인스턴스 변수가 클래스 변수를 공유한다. JVM이 해당 클래스를 읽는 순간 클래스 변수(static 변수)는 초기화 된다. static 메소드= 클래스 메소드 클래스 안에 선언되어 있지만 다른 메모리 공간에 존재한다. 클래스는 클래스 메소드에 자리를 빌려줬다 생각하자. 또는 클래스는 메소드를 사용할 권한이 있을 뿐이다. 클래스 메소드도 마찬가지로 인스턴스 메소드가 아니다. 단순 기능 제공이 목적인 메소드들이나 인스턴스 변수와 관련 없는 메소드들은 staic으로 선언하는게 좋다. static 이기 때문..
JAVA 09 정보은닉과 캡슐화
·
Programming/Java
정보은닉 데이터나 기능을 포함한 클래스 내에서만 접근을 허용하겠다. 문법적 오류는 컴파일 오류가 발생해 문제를 파악할 수 있지만, 논리적 오류는 컴파일 오류가 발생하지 않아 문제 파악이 힘들 수 있다. 논리적 오류가 발생했을 때, 논리적 오류를 문법적 오류로 되게 해주는게 정보 은닉의 장점 중 하나다. 직접 접근했을 때 컴파일 에러가 발생하도록 강제한다. 멤버를 선언할 때, private을 붙여주면 같은 멤버 끼리는 공유할 수 있지만 클래스 외부에서 접근할 때는 컴파일 오류가 발생한다. 접근 수준 지시자 public: 어디서든 인스턴스 생성이 가능하다. protected default private