-
728x90반응형SMALL
자바 프로그래밍의 특징
- 플랫폼에 영향을 받지 않으므로 다양한 환경에서 사용할 수 있다.
- 객체 지향 언어이기 때문에 유지보수가 쉽고 확장성이 좋다
- 프로그램이 안정적이다
- 풍부한 기능이 제공되는 오픈 소스이다.
객체 지향 프로그래밍
- 프로램의 구현을 시간의 흐름 순이 아닌 객체간의 협력을 기반으로 프로그램 하는 것
- OOP(Object Oriented Programming)이라고 한다
용어
JDK (JAVA Development Kit) : 자바에서 제공되는 개발용 라이브러리
JRE (JAVA Runtime Environment) : 자바 프로그램 실행 환경
JVM (Java Virtual Machine) : 자바 가상 머신으로 프로그램이 실행되는 환경인 JRE가 설치되어 있어야 한다
객체
- 의사나 행위가 미치는 대상
- 구체적, 추상적 데이터의 단위
OOP 순서
- 객체 정의
- 객체의 속성은 멤버 변수와 메서드로 구현
- 객체간의 협력을 구현
클래스
- 대문자로 시작하는 것이 좋음
- java 파일 하나에 클래스는 여러 개가 있을 수 있지만, public 클래스는 하나이고 public 클래스 이름과 .java 파일의 이름은 동일
메서드
- 객체의 기능을 구현하기 위해 클래스 내부에 구현된 함수
- 멤버 함수라고도 함
- 메서드를 구현함으로써 객체의 기능이 구현됨
- 클래스 이름에 맞춰 명명하는 것이 좋음
→ 객체의 속성은 멤버 변수로, 객체의 기능은 메서드로 구현
인스턴스
- 클래스는 객체의 속성을 정의하고 기능을 구현한 코드
- 실제 클래스 기반으로 생성된 객체(인스턴스)는 각기 다른 멤버 변수 값을 가지게 된다
new()
키워드를 통해 인스턴스 생성
힙 메모리
- 생성된 인스턴스는 동적 메모리에 할당됨
- 자바에서는 Garbage Collector가 주기적으로 사용하지 않는 메모리를 수거
- 하나의 클래스로부터 여러 개의 인스턴스가 생성될 경우 각기 다른 메모리 주소를 가지게 된다
객체 : 객체 지향 프로그램의 대상, 생성된 인스턴스 클래스 : 객체를 정의하기 위한 코드 상태 인스턴스 : new 키워드를 통해 클래스를 메모리에 적재한 상태 멤버 변수 : 클래스의 속성, 특성 메서드 : 멤버 변수를 이용하여 클래스의 기능을 구현한 함수 참조 변수 : 메모리에 생성된 인스턴스를 가리키는 변수 참조 값 : 생성된 인스턴스의 메모리 주소 값
생성자
- 생성자 기본 문법
<class\_name>(\[<argument\_list\]){<statements\]}
- 객체를 생성할 때 new 키워드와 함께 사용 -
new 생성자();
- 생성자는 일반 함수처럼 기능을 호출하는 것이 아님, 객체를 생성하기 위해 new와 함께 호출됨
- 객체가 생성될 때 변수나 상수를 초기화 하거나 다른 초기화 기능을 수행하는 메서드를 호출
- 생성자는 반환 값이 없고, 클래스의 이름과 동일
- 대부분의 생성자는 외부에서 접근 가능하지만, 필요에 의해 private으로 선언될 수 있따.
기본 생성자
- 클래스에는 반드시 하나 이상의 생성자가 존재
- 클래스에 생성자를 구현하지 않아도 new 키워드와 함께 생성자를 호출할 수 있따.
- 클래스에 생성자가 없어도 컴파일러가 자동으로 생성자 코드를 넣어줌
- 매개 변수와 구현부가 없음
public 클래스명(){}
생성자 오버로딩
- 생성자를 따로 정의하여 사용할 수 있음
- 클래스에 생성자를 따로 구현하면 기본 생성자는 제공되지 않음
- 여러 생성자를 정의해두고 필요에 따라 원하는 생성자를 호출해서 사용할 수 있음
public class UserInfo { public String userId; public String userPassWord; public String userName; public String userAddress; public String phoneNumber; public UserInfo(){} public UserInfo(String userId, String userPassWord, String userName) { this.userId = userId; this.userPassWord = userPassWord; this.userName = userName; } public String showUserInfo() { return "고객님의 아이디는 " + userId + "이고, 등록된 이름은 " + userName + "입니다."; } }
public class UserInfoTest { public static void main(String[] args) { UserInfo userLee = new UserInfo(); userLee.userId = "a12345"; userLee.userPassWord = "zxcvbn12345"; userLee.userName = "Lee"; userLee.phoneNumber = "01034556699"; userLee.userAddress = "Seoul, Korea"; System.out.println(userLee.showUserInfo()); UserInfo userKim = new UserInfo("b12345", "09876mnbvc", "Kim"); System.out.println(userKim.showUserInfo()); } }
변수의 자료형
- 기본 자료형 :
int
,double
,float
,double
- 참조 자료형 :
String
,Date
,Student
등 - 기본 자료형은 사용하는 메모리의 크기가 정해져 있지만, 참조 자료형은 클래스에 따라 다름
- 참조 자료형을 사용할 때는 해당 변수에 대해 생성해야 함 (
String
은 예외)
접근 제어 지시자
- 클래스 외부에서 클래스의 멤버 변수, 메서드, 생성자에 접근 정도를 구분하는 키워드
- private : 같은 클래스 내부에서만 접근 가능 (외부 클래스, 상속 관계의 클래스에서도 접근 불가)
- 아무 것도 없는 경우(default) : 같은 패키지 내부에서만 접근 가능 (상송 관계라도 패키지 다르면 접근 불가)
- protected : 같은 패키지나 상속관계의 클래스에서 접근 가능하고 그 외에서는 접근 불가
- public : 어디서든 접근 가능
get / set
- private으로 선언된 멤버 변수에 접근, 수정할 수 있는 메서드를 public으로 제공
get()
의 경우 read-only- private으로 제어한 멤버 변수를 Public 메서드를 통해 접근 가능하지만 변수가 public으로 제공되었을 때보다 private일 때 변수에 대한 제한을 public 메서드에서 제어할 수 있다.
public void setMonth(int month) { if ( month < 1 || month > 12) { isValid = false; } else { this.month = month; } }
캡슐화
- 꼭 필요한 정보와 기능만 외부에 오픈
- 대부분의 멤버 변수와 메서드를 감추고 외부에 통합된 인터페이스만 제공하여 일관된 기능을 구현
- 각각의 메서드나 멤버 변수를 접근함으로써 발생하는 오류를 최소화
this
- 인스턴스 자신의 메모리를 가리킴
- 생성자에서 또 다른 생성자를 호출할 때 사용
- 자신의 주소(참조값)를 반환 함
- 클래스의 생성자가 여러 개일 경우, this를 이용하여 생성자에서 다른 생성자를 호출할 수 있음
- 생성자에서 다른 생성자를 호출할 경우, 인스턴스의 생성이 완전하지 않은 상태이므로
this()
statement 이전에 다른 statement를 쓸 수 없음
public class Person { String name; int age; public Person() { this("이름없음", 1); } public Person(String name, int age) { this.name = name; this.age = age; } }
협력
- 객체 지향 프로그래밍은 객체들간의 협력으로 이루어짐
- 협력을 위해서는 필요한 메시지를 전송하고 이를 처리하는 기능이 구현되어야 한다
- 매개 변수로 객체가 전달되는 경우가 발생
static 변수
- 여러 인스턴스가 공유하는 기준 값이 필요한 경우
- 인스턴스가 생성될 때 만들어지는 변수가 아니라, 처음 프로그램이 메모리에 로딩될 때 메모리에 할당됨
- 클래스 변수, 정적 변수라고 한다
- 인스턴스 생성과 상관 없이 사용가능하므로 클래스 이름으로 직접 참조 가능
static 메서드
- static 변수를 private으로 선언, getter/setter 구현
- static 메서드는 인스턴스 생성과 무관하게 클래스 이름으로 호출될 수 있음
- 인스턴스 생성 전에 호출될 수 있으므로 static 메서드 내부에서는 인스턴스 변수를 사용할 수 없음
- static 변수는 프로그램이 메모리에 있는 동안 계속 그 영역을 차지하므로 너무 큰 메모리를 할당하는 것은 좋지 않다
- 클래스 내부의 여러 메서드에서 사용하는 변수는 멤버 변수로 선언하는 것이 좋음
- 멤버 변수가 너무 많으면 인스턴스 생성 시 쓸데없는 메모리가 할당됨
싱글톤 패턴
- 프로그램에서 인스턴스가 단 한 개만 생성되어야 하는 경우 사용하는 디자인 패턴
- static 변수, 메서드를 활용하여 구현할 수 있음
1. 생성자는 private으로 선언
private Company(){}
2. 클래스 내부에 유일한 private 인스턴스 생성
private static Company instance = new Company();
3. 외부에서 유일한 인스턴스를 참조할 수 있는 public 메서드 제공
public static Company getInstance(){ if(instance==null){ instance = new Company(); } return instance; }
배열 선언
int[] arr1 = new int[10]; int arr2[] = new int[10];
- 배열은 선언과 동시에 자료형에 따라 초기화 됨 (정수는 0, 실수는 0.0, 객체는 null)
- 필요에 따라 초기값을 지정할 수 있다
int[] numbers = new int[] {10,20,30}; // 개수 생략해야 함 int[] numbers = {10, 20, 30}; // new int[] 생략 가능 int[] ids; ids = new int[] {10, 20, 30}; // 선언 후 배열을 생성하는 경우는 new int[] 생략 불가
객체 배열
- 기본 자료형 배열은 선언과 동시에 배열의 크기만큼의 메모리가 할당되지만, 객체 배열의 경우엔 요소가 되는 객체의 주소가 들어갈 메모리만 할당되고 각 요소 객체는 생성하여 저장해야 함
객체 복사
- 얕은 복사
- 객체 주소만 복사되어 한쪽 배열의 요소를 수정하면 같이 수정됨
- 두 배열이 같은 객체 배열을 가리키게 된다
- 깊은 복사
- 각각의 객체를 생성하여 그 객체의 값을 복사해 배열이 서로 다른 객체를 가리키도록 함
arrayList
- java.util 패키지에서 제공된다
- 기존의 배열 선언과 사용 방식은 배열의 길이를 정하고 요소의 개수가 배열의 길이보다 커지면 배열을 재할당하고 복사해야 했음
- 배열의 요소를 추가하거나 삭제하면 다른 요소들의 이동에 대한 구현을 해야 함
- ArrayList는 객체 배열을 좀 더 효율적으로 관리하기 위해 자바에서 제공해주는 클래스
- 이미 많은 메서드들이 최적의 알고리즘으로 구현되어 있어 각 메서드의 사용 방법만 익히면 유용하게 사용할 수 있음
메서드
boolan add(E e)
: 요소 하나를 배열에 추가, E는 요소의 자료형을 의미int size()
: 배열에 추가된 요소 전체 개수를 반환E get(int index)
: 배열의 index 위치에 있는 요소 값을 반환E remove(int index)
: 배열의 index 위치에 있는 요소 값을 제거하고 그 값을 반환boolean isEmpty()
: 배열이 비어 있는지 확인
반응형LIST'언어 > Java' 카테고리의 다른 글
자바 내부 클래스, 람다식, 함수형 프로그래밍, 함수형 인터페이스 (2) 2023.07.13 자바 자료구조, 제네릭, 컬렉션 (0) 2023.07.11 자바 Object, Class (5) 2023.07.10 자바 추상 클래스, 인터페이스 (0) 2023.07.08 자바 클래스, 상속, 다형성 (0) 2023.07.07