상속과 컴포지션 상속과 컴포지션, 재사용성 * 상속과 컴포지션은 재사용성을 위해 사용된다. * 둘 중 어떤 걸 사용해도 구현은 가능하다. (대부분) 특수한 상황에서 차이점이 나타나기도 한다. (성능, 관리 등등) * 특별한 상황이 아니라면, 사람이 생각하는 것처럼 만드는게 좋다. 사람이 생각하기 편하게 설계하는 것이 가독성도 높고, 이해가 편하기 때문이다. 성능 * 성능은 상속이 더 좋다. * 상속은 객체 생성 시 메모리가 하나의 덩어리로 만들어진다. 컴포지션은 각각 메모리가 생성되고 분산되어 있다. * 컴포지션의 분산된 메모리는 실행 성능의 큰 영향을 미친다. (CPU 캐시메모리 메모리) 형태로 데이터가 전송되는데, 캐시메모리는 사용할 메모리의 주변 메모리까지 한꺼번에 가져온다. * 즉, 현재 사용한 ..
내포 클래스 Nested Class 2가지 내포 클래스 * 내포 클래스란 클래스 안에서 선언된 클래스를 만한다. // 외부 클래스 public class Outer{ // 내포 클래스 public class Nested{ } } * 외부 클래스는 접근지정자로 public, package만 사용할 수 있지만, 내포 클래스는 protected, private를 추가로 더 사용할 수 있다. * 클래스이므로 객체, 생성자, 접근지정자, 메서드 모두 만들고 사용할 수 있다. * 자바에는 2가지 방법의 내포 클래스가 있다. 1. 비정적 내포 클래스 (Non-static Nested Class) (내부 클래스라고도 한다. (Inner Class)) 2. 정적 내포 클래스 (static nested class) * C..
싱글톤 패턴 Singletone Pattern 언제 사용함 * 클래스가 만들 수 있는 인스턴스 개수가 최대 하나인 패턴. * 인스턴스를 전역적으로 접근할 수 있음. 구현 public class Singletone{ private static Singletone singletone; private Singletone() { } public static Singletone getInstance() { if(singletone == null){ singletone = new Singletone(); } return singletone; } } * private Singletone() = 생성자가 private이므로 외부에서 객체를 생성하지 못한다. * private static Singletone single..
getter와 setter private 멤버 변수의 문제점 * 멤버 변수를 private로 하면 외부에서 정보를 보거나 변경하지 못한다. 문제는 정보 보기와 변경을 둘 다 못한다는 것이다. * 정보는 보여주지만 변경은 하지 못하게 하고 싶다. 이런 제어는 접근제어자로만은 불가능하다. * 따라서 private 멤버 변수는 그대로 두고 get과 set를 담당하는 메서드를 만들어 원하는 제어가 가능하도록 한다. * 이런 함수를 getter함수, setter함수라고 한다. 언제 사용함 * 멤버변수의 정보 보기와 변경의 접근제어자를 다르게 하고 싶을 때 * 멤버 변수를 바꿀 때 조건을 추가하고 싶을 때 * 사용자가 원하는 데이터가 직접 저장되어있는 게 아닌 계산을 해야만 하는 상황일 때 getter / sett..
접근지정자 클래스명 (매개변수목록){ } 생성자란 * 생성자는 객체를 생성할때 호출되는 일종의 메서드이다. 객체 생성 시 반드시 호출된다. * 반환형이 없고 클래스명으로 이름을 지어야한다. 생성하지 못하는 생성자 * 생성자를 private로 만들 수도 있다. 당연히 외부에서 new 객체를 하여도 만들 수 없다. * 이 생성자는 내부에서만 호출이 가능하다. 예를 들어 public 생성자가 내부에서 private 생성자를 호출할 수 있다. 또는 클래스의 객체 생성을 원하지 않을 때 사용하기도 한다. 기본 생성자 Default Constructor * 클래스를 만들 때 생성자를 만들지 않으면 자동으로 추가되는 생성자 컴파일러가 알아서 넣어준다. * 기본 생성자는 매개변수가 없고, 생성자에 내용이 없다. (멤버..
다형성 Polymorphism OOP의 4대 특성 * 다형성은 OOP(Object Oriented Programming)의 4대 특성 중 하나로 주류 OO언어에 꼭 들어가는 개념이다. * 그중에서도 가장 핵심이라고 생각되는 개념이다. 넓은 의미의 다형성 * 넓은 의미에서 다형성은 무언가가 여러가지로 변할 수 있다는 의미이다. 약간만 축소하자면 객체가 여러 타입으로 변할 수 있다는 의미이다. * 자바나 C++같이 대중적인 언어들은 다형성에 많은 제한을 두고 사용한다. (제한 내용은 거의 같다.) 많이 채택하고 있는 다형성 * 자바와 C++같은 대중적인 객체지향 언어는 다형성을 부모 자식관계에서만 허용한다. * 객체가 무엇이든지 변할 수 있는 자유도보다 부모자식관계로 제한된 다형성이 자유도는 적지만 실수가 ..
데이터 추상화 Data Abstraction 선행 * 데이터 추상화를 쉽게 이해하기 위해서는 캡슐화가 무엇인지 알아야 한다. [JAVA]자바 - 캡슐화 Encapsulation 캡슐화 Encapsulation OOP의 4대 특성 * 캡슐화는 OOP(Object Oriented Programming)의 4대 특성 중 하나로 주류 OO언어에 꼭 들어가는 개념이다. * 캡슐화는 데이터와 함수를 클래스라는 개념으로 묶은 것이다.. licktwice.tistory.com OOP의 4대 특성 * 데이터 추상화는 OOP(Object Oriented Programming)의 4대 특성 중 하나로 주류 OO언어에 꼭 들어가는 개념이다. * 데이터 추상화는 좋은 캡슐화만으로 얻을 수 있다. * 데이터 추상화는 꼭 OO에서..
캡슐화 Encapsulation OOP의 4대 특성 * 캡슐화는 OOP(Object Oriented Programming)의 4대 특성 중 하나로 주류 OO언어에 꼭 들어가는 개념이다. * 캡슐화는 데이터와 함수를 클래스라는 개념으로 묶은 것이다. 또한 접근제어자를 통해 다른 사람들이 클래스를 사용할 때 선택적으로 제한함으로써 클래스를 보호하는 것이다. * 캡슐화란 사용자에게 선택적으로 제공하는 것이다. 클래스, 구조체의 발전된 버전 * 구조체란 데이터들의 묶음이었다. * 구조체를 사용하면, 자료형이 다른 데이터들을 하나의 개념에 묶을 수 있었다. * 구조체를 사용하면, 연관된 데이터들을 하나의 개념에 묶을 수 있었다. * 이러한 장점들로 구조체의 사용은 사용자의 가독성과 이해를 돕는 역할을 하기도 한다..
빌드와 라이브러리 준비 * 프로젝트명 = HelloWord * 패키지명 = com.tistory.licktwice * 클래스명 = MainHello 컴파일 * 자바는 .java파일을 컴파일하면 .class파일이 나온다. * .class파일은 기계어가 아닌 바이트코드로 이루어져있다. .class파일은 OS가 아닌 JVM을 통해 읽을 수 있다. * .class파일은 .java파일 패키지와 동일한 폴더 구조가 생성된다. 배포 * 자바에서는 프로그램과 라이브러리가 모두 .jar 파일이다. * .jar 파일은 .zip처럼 압축파일이다. (필요한 모든 것들이 들어있음.) Manifest * .jar파일 -> META-INF파일 -> MANIFEST.MF이라는 파일이 있다. * 자바 애플리케이션에 관한 정보를 담고 ..
패키지 Package 패키지란? * 클래스들을 묶을 수 있는 단위. * 패키지 = 파일, 클래스 = 파일 안에 담긴 데이터라고 생각하는 게 쉽다. * 패키지명은 보통 소문자 사용하는 이유 * 클래스를 묶을 수 있는 단위가 생겼다. ↓ * 연관된 클래스끼리 패키지 단위로 묶을 수 있다. ↓ * 수 많은 클래스가 한번 정리가 되어 보기 편하고, 유지 및 관리가 쉽다. * 클래스명 중복이 일어나도 패키지가 다르다면 문제가 없다. 패키지명 중복 * 패키지의 사용으로, 클래스 이름 충돌이 일어나도 괜찮아졌지만 패키지 이름충돌이라는 새로운 문제점이 생겼다. * 패키지명의 중복은 꼭 피해야 한다. 패키지명의 고유성을 보장하기 위해 최상위 패키지명을 인터넷 도메인 주소를 역순으로 사용하기도 한다. * 도메인을 역순으로..