클래스: 객체 추상화-객체의 청사진(blueprint), 대문자로 시작
public class 클래스명{ 자료형 멤버변수; }
함수와 메서드(멤버함수) 차이: 함수는 단독모듈, 메서드는 클래스 속에서 멤버변수를 이용하여 기능 구현
✔️ 클래스에 생성된 객체
✔️ new 키워드 사용하여 인스턴스 생성
✔️ 생선된 인스턴스는 동적메모리(heap memory)에 할당
✔️ C에서는 malloc()/free()
✅ 참조변수: studentLee
✅ 참조값: Student@4517d9a3
Student studentLee = new Student();
studentLee.studentName = "이순신";
생성자(constructor): 클래스와 이름 동일, 반환값 없음
✔️ 멤버변수 사용 시 'this.멤버변수' 와 같이 접근
✔️ dafult 생성자 제공 public Student( ){ };
오버리딩(Overloading): 메소드 이름이 같고 매개변수의 개수나 타입이 다른 경우, 단 리턴값만 다르게 지정하는 것은 오버로딩 할 수 없음
public class Student {
public int studentNumber; //멤버변수
public String studentName;
public int grade;
//기본생성자
public Student() {
System.out.println("인스턴스 생성);
}
// 오버로딩
public Student(int studentNumber, String studentName, int grade) {
this.studentNumber = studentNumber;
this.studentName = studentName;
this.grade = grade;
}
}
public > default > protected > private
✅ private: 같은 클래스 내부만, 상속관계 클래스도 접근 불가
✅ (default): 같은 패키지 내부만, 상속관계라도 패키지가 다르면 접근 불가
✅ protected: 같은 패키지나 상속관계 클래스만
✅ public: 클래스 외부 모두 가능
get() / set() 메서드:
✔️ private 변수를 선언 또는 반환하기 위해 public으로 된 수정 가능한 메서드
✔️ get만 제공되는 경우 read-only
✔️ Eclipse: 우클릭➡️source➡️generate getters and setters
❶ 인스턴스 자신의 메모리; this.age = age
❷ 클래스 생성자가 여러개인 경우, 생성자에서 또 다른 생성자를 호출(단, 인스턴스의 생성이 완전하지 않은 상태이므로 this이전에 다른 식 쓸 수 없음)
public Person() {
//이 앞에 식 쓸수 없음
this("이름없음", 1);
}
❸ 자신의 주소(참조값) 반환; return this
: 정적, 전역, 인스턴스 생성될 때가 아닌 처음 프로그램이 메모리에 로딩될 때(컴파일) 메모리 할당(데이터 영역)
✅ static 변수: 클래스변수, 정적변수(↔인스턴스변수)
✔️ 여러 인스턴스가 공유
✔️ 프로그램이 메모리에 있는 동안 계속 그 영역을 차지하므로 너무 큰 메모리 할당X
static int serialNum;
Student.serialNum = 100;
✅ static 메서드: 변수를 private으로 선언하고 get/set 구현, 클래스 이름으로 호출
✔️ 정적 메서드는 객체 참조 없이 바로 사용할 수 있으므로 인스턴스, 메서드, this 사용 불가
public static int getSerialNum(){}
Employee.serialNum = serialNum;
✅ final 변수: 한번만 초기화 가능, static이 붙으면 상수
✅ final 메서드: 상속 시 해당 메서드 재정의 불가
✅ final class: 해당 클래스 상속불가 ex.String
: 프로그램에서 인스턴스가 단 한개만 생성되어야하는 경우 사용하는 디자인 패턴
✴️ 생성자 private
✴️ 클래수 내부 유인할 private 인스턴스 생성
✴️ 외부에서 유일한 인스턴스를 참조 할 수 있는 public 메서드
Company@4517d9a3
Company@4517d9a3
class Company{
private Company() {}
private static Company instance = new Company();
public static Company getInstance() {
if( instance == null) {
instance = new Company();
}
return instance;
}
public static void main(String[] args) {
// 클래스 이름으로 호출
Company company1 = Company.getInstance();
Company company2 = Company.getInstance();
System.out.println(company1);
System.out.println(company2);
//Calendar calendar = Calendar.getInstance();
}
}
입력:
✅ Scanner: ,nextInt(),nextDouble(), nextFloat()
✴️ next(): 문자열 리턴
✴️ nextLine(): 공백이 있는 문자열 입력
Scannner sc = new Scanner(System.in);
✅ BufferedReader: scanner보다 빠름
✴️ br.readline(): 입력받은 한 줄
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
출력:
✅ System.out.println()
✅ BufferdWriter: BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(System.out));
bufferedWriter.write("Hello World!");
bufferedWriter.flush();
bufferedWriter.newLine();
bufferedWriter.close();
Array : 동일한 자료형의 순차적 자료구조
✔️ 물리적 위치와 논리적 위치가 동일
int[] arr1 = new int[10];
int arr2[] = new int[10];
int [][]arr3 = new int[2][10];
int arr4[][] = new int[2][10];
초기화: int 0, double 0.0, String null
✅ //개수 생략
int[] numbers = new int[] {10, 20, 30};
✅ // new int[] 생략 가능
int[] numbers = {10, 20, 30};
✅ // 선언후 new int[] 생략할 수 없음
int[] ids;
ids = new int[] {10, 20, 30};
for문 활용
for(char alpha : alpahbets) {
System.out.println(alpha +","+ (int)alpha);
}
객체 배열 복사: 원래 배열이 변하면 따라서 변경됨
System.arrayCopy(src, srcPos, dest, destPos, length)
✅ src: 원본 배열
✅ srcPos: 원본 소스 어느 부분부터 읽어올지
✅ dest: 복사할 소스
✅ destPos: 어느부분부터 쓸것인지
✅ length: 원본에서 복사본으로 데이터를 읽어서 쓸 데이터 길이
ArrayList: java.util, 대량의 자료 추가/삭제에 부적합, 데이터 검색 시 빠름
ArrayList numbers = new ArrayList<>();
iterator(): 순방향
Iterator iterator = numbers.iterator();
✅ hasNext(): 다음 엘리먼트가 있는 지 확인
iterator.hasNext()
✅ next(): 다음 엘리먼트 가져옴
Integer next = iterator.next();
✅ remove(): next()로 가져온 엘리먼트 삭제
iterator.remove()
listIterator(): 양방향, hasNext(), next()
✅ hasPrevious(): 이전 엘리먼트가 있는 지
✅ previous(): 이전 값 가저옴
추가: add(Object o), addAll(Collection c)
numbers.add(10); // [10]
numbers.add(20); // [10, 20]
numbers.add(1, 15); // [10, 15, 20]
numbers.addAll(numbers); // [10, 15, 20, 10, 15, 20]
numbers.addAll(1, numbers); // [10, 10, 15, 20, 15, 20, 15, 20]
교체: set(idx, E element)
numbers.set(0, 100);
삭제: remove(idx)
✅ remove(Object o): numbers.remove(Integer.valueOf(100));
✅ removeAll(Collection c):
A.removeAll(B) // A에서 B만제거
✅ retainAll(Collection c):
A.retainAll(B) // A에서 B만 남김
✅ removeIf(조건식): 메소드 삭제시 필터링을 하는 작업이 필요할 때
numbers.removeIf(n -> n % 3 == 0) // 3의 배수 모두 삭제
✅ clear(): 요소 모두 비워줌 // []
복제: clone()
ArrayList newNumbers = (ArrayList) numbers.clone();
엘리먼트 수: size()
값 검색
✅ get(idx): 엘리먼트 가져옴
numbers.get(0)
✅ indexOf(Object o)/lastindexOf(Object o): 엘리먼트 인덱스:
System.out.println(numbers.indexOf(10));
✅ subList(fromIdx, toIdx): fromIdx에서 toIdx까지 엘리먼트
subListList newNumbers = numbers.subList(1,3);
요소/객체 여부(T/F)
✅ 요소 존재 여부 확인: isEmpty()
numbers.isEmpty() // ture or false
✅ 객체 존재 여부 확인: contains(Object o)
numbers.contains(100) // ture or false
for-loop:
numbers.forEach(number -> System.out.print(number+" "));
// 10 10 15 20 15 20 15 20
정렬: sort(Collection c)/reverse(Collection c)
변환
✅ array->List: toArray()
Integer[] array = numbers.toArray(new Integer[numbers.size()]);
✅ List->array-: asList()
ArrayList List = new ArrayList<>(Arrays.asList(array));