[JAVA] 02. 인스턴스/생성자/접근제어 지시자/static/배열/ArrayList

Hyeongmin Jung·2023년 4월 12일
0

java

목록 보기
28/28

🐣 객체 지향 프로그래밍

  • 절차지향 프로그래밍: 시간/사건의 흐름에 따라_ c언어
  • 객체지향 프로그래밍: c++, c#, python, javascript
    객체 정의-객체기능(메서드) 구현-객체 간 상호작용

🐥 클래스 & 메서드

  • 클래스: 객체 추상화-객체의 청사진(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;
	}
}

🐥 접근 제어 지시자(access modifier)

  • public > default > protected > private
    private: 같은 클래스 내부만, 상속관계 클래스도 접근 불가
    (default): 같은 패키지 내부만, 상속관계라도 패키지가 다르면 접근 불가
    protected: 같은 패키지나 상속관계 클래스만
    public: 클래스 외부 모두 가능

  • get() / set() 메서드:
    ✔️ private 변수를 선언 또는 반환하기 위해 public으로 된 수정 가능한 메서드
    ✔️ get만 제공되는 경우 read-only
    ✔️ Eclipse: 우클릭➡️source➡️generate getters and setters

🐤 this

❶ 인스턴스 자신의 메모리; this.age = age
❷ 클래스 생성자가 여러개인 경우, 생성자에서 또 다른 생성자를 호출(단, 인스턴스의 생성이 완전하지 않은 상태이므로 this이전에 다른 식 쓸 수 없음)

public Person() { 
	//이 앞에 식 쓸수 없음
	this("이름없음", 1); 
}

❸ 자신의 주소(참조값) 반환; return this

🐥 Static

: 정적, 전역, 인스턴스 생성될 때가 아닌 처음 프로그램이 메모리에 로딩될 때(컴파일) 메모리 할당(데이터 영역)
✅ static 변수: 클래스변수, 정적변수(↔인스턴스변수)
✔️ 여러 인스턴스가 공유
✔️ 프로그램이 메모리에 있는 동안 계속 그 영역을 차지하므로 너무 큰 메모리 할당X
static int serialNum;
Student.serialNum = 100;

✅ static 메서드: 변수를 private으로 선언하고 get/set 구현, 클래스 이름으로 호출
✔️ 정적 메서드는 객체 참조 없이 바로 사용할 수 있으므로 인스턴스, 메서드, this 사용 불가
public static int getSerialNum(){}
Employee.serialNum = serialNum;

  • 변수의 유효 범위 & 메모리

🐥 final

✅ final 변수: 한번만 초기화 가능, static이 붙으면 상수
✅ final 메서드: 상속 시 해당 메서드 재정의 불가
✅ final class: 해당 클래스 상속불가 ex.String

🐥 싱글톤 패턴(singleton pattern)

: 프로그램에서 인스턴스가 단 한개만 생성되어야하는 경우 사용하는 디자인 패턴
✴️ 생성자 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();
  • 문자열:
    String: 불변, 문자열을 자주 읽어들이는 경우 적합 but 문자열 추가/수정/삭제가 빈버한 경우 힙메모리에 많은 임시 가비지를 생성하므로 비추천(Stringbulider/Stringbuffer 사용)

    StringBuilder: 단일 쓰레드, 지속적인 출력이 아닌 출력물을 모아서 한번에 출력할 때 적합
    StringBuilder sb = new StringBuilder();
    stringBuilder.append("Hello\n");
    System.out.println(sb)


    StringBuffer: 멀티 쓰레드
    StringBuffer stringBuffer = new StringBuffer();
    stringBuffer.append("123\n");
    bufferedWriter.write(stringBuffer.toString());


    StringTokenizer:
    // , 을 구분자로 string 나눔
    StringTokenizer st = new StringTokenizer(br.readLine(), ',');
    st.nextToken()

🐤 배열

  • 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

  • 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));


  • LinkedList: 데이터 추가/삭제 빠름, 데이터검색 느림

0개의 댓글