메서드 오버로딩

한 클래스 내의 같은 이름의 메서드를 여러 개 정의하는 것 (오버라이딩과 아무 관련 x)

 

오버로딩의 조건

  1.  메서드 이름이 같아야 한다.
  2.  매개변수의 개수 또는 타입이 달라야 한다.
  3.  반환 타입은 관계 없다.

 

생성자

인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드로 모든 클래스에는 반드시 하나 이상의 생성자가 정의되어 있어야 한다.

연산자 new가 인스턴스를 생성하는 것이지 생성자는 인스턴스를 생성하지 않는다.

클래스에 정의된 생성자가 하나도 없을 때만 컴파일러가 기본 생성자를 제공한다.

 

생성자의 조건

  1.  생성자의 이름 = 클래스의 이름
  2.  리턴 값이 없으나 void를 붙이지 않는다.

 

생성자 this()

생성자에서 다른 생성자를 호출할 때 사용

다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.

class Car2 {
    String color;
    String gearType;
    int door;
    Car2(){
        this("white", "auto", 4); // Car2(String color, String gearType, int door) 호출
    };
    Car2(String color){
        this(color, "auto", 4); // Car2(String color, String gearType, int door) 호출
    };
    Car2(String color, String gearType, int door){
        this.color = color; // this.color(iv) 와 color(lv) 구별
        this.gearType = gearType;
        this.door = door;
    }
}

 

참조변수 this

인스턴스 자신을 가리키는 참조변수, 인스턴스의 주소가 저장되어 있다.

인스턴스 메서드(생성자 포함)에서만 사용 가능 ➡️ 클래스 메서드(static 메서드)에서 사용 불가

지역변수와 인스턴스 변수를 구별하기 위해 사용한다.

위 코드에서 this.color는 String color;로 선언된 인스턴스 변수를 의미하고 color는 매개변수로 받은 지역변수 color를 의미한다.

참조변수 this와 생성자 this()는 아무런 관련이 없다.

'TIL > WEEK2' 카테고리의 다른 글

JAVA3 객체지향 프로그래밍1  (0) 2023.05.25
JAVA 2주차 배열과 컬렉션  (0) 2023.05.24
JAVA 2주차 조건문과 반복문  (0) 2023.05.23
JAVA 1주차  (0) 2023.05.22
  • 객체 : 속성(변수) + 기능(메서드) 모든 인스턴스를 대표하는 일반적 용어
  • 인스턴스 : 특정 클래스로부터 생성된 객체

 

클래스 변수와 인스턴스 변수

class MyVariables {
    int iv; // 인스턴스 변수
    static int cv; // 클래스 변수
    void method(){
        int lv = 0; // 지역 변수
    }   
}

인스턴스 변수 : 인스턴트가 생성 되었을 때 생성

클래스 변수 : 클래스가 메모리(RAM)에 로딩될 때 생성

지역 변수 : 메서드가 실행될 때 생성되었다가 종료시 자동으로 제거, 사용하기 전에 반드시 초기화해야 한다.

 

➡️ 인스턴스 변수는 인스턴트가 생성될 때 마다 생성되므로 인스턴스마다 다른 값을 가지지만, 클래스 변수는 모든 인스턴스가 하나의 저장공간을 공유하므로, 항상 공통된 값을 갖는다.

 

 

기본형 매개변수와 참조형 매개변수

기본형 매개변수 : read만 할 수 있고 write 불가능

참조형 매개변수 :  read & write 가능

 

 

static 메서드와 인스턴스 메서드

static 메서드

  • 객체 생성 없이 클래스이름.메서드이름()으로 호출  예) Math.random()
  • 인스턴스 멤버와 관련없는 작업을 하는 메서드로 메서드 내에 인스턴스 변수나 메서드 사용 불가능 ➡️ 즉, 인스턴스 멤버(iv, im)를 사용하지 않는 메서드에 static을 붙인다!

 

static은 언제 붙여야 할까?

  1. 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통으로 사용하는 것에 static을 붙인다.
  2. 클래스 변수(static 변수)는 인스턴스를 생성하지 않아도 사용할 수 있다.
  3. 클래스 메서드는(static 메서드)는 인스턴스 변수를 사용할 수 없다. 고로, 메서드 내에서 인스턴스 변수를 사용하지 않는다면 static을 붙이는 것을 고려한다.

 

 

 

 

 

 

'TIL > WEEK2' 카테고리의 다른 글

JAVA3 객체지향 프로그래밍2  (0) 2023.05.26
JAVA 2주차 배열과 컬렉션  (0) 2023.05.24
JAVA 2주차 조건문과 반복문  (0) 2023.05.23
JAVA 1주차  (0) 2023.05.22

Array

배열은 크기를 지정해 놓고 생성해야 된다. 이처럼 크기를 고정해 놓고 생성하는 것을 정적 배열이라 한다.

int[] arr = new int[3]; // 크기를 지정해놓고 생성
arr[0] = 1;
System.out.println(arr[0]);

 

얕은 복사

int[] a = {1, 2, 3, 4};
int[] b = a;
b[0] = 3;
System.out.println(a[0]);

// 결과 : 3

이렇게 복사하면 배열의 주소값이 복사되어 a와 b가 같은 값을 가리키게 된다.

 

깊은 복사

clone() 메서드는 2차원이상 배열에서는 얕은 복사로 동작한다.

        int[] a = {1, 2, 3, 4};
        int[] b = a.clone();
        b[0] = 3;
        System.out.println("b[0] : " + b[0]);
        System.out.println("a[0] : " + a[0]);
        
// 결과 : b[0] : 3
//       a[0] : 1

 

그러므로, 배열을 복사할 때는 copyOf() 메서드를 이용한다.

// 깊은 복사 메서드

import java.util.Arrays;

public class Main {
	public static void main(String[] args) {
		// 2. Arrays.copyOf() 메서드
		int[] a = { 1, 2, 3, 4 };
		int[] b = Arrays.copyOf(a, a.length); // 배열과 함께 length값도 같이 넣어줍니다.
	}
}

 

Collection

 

 List

리스트는 크기가 가변적으로 늘어나는 동적배열이다.

        ArrayList<Integer> intList = new ArrayList<Integer>(); // 선언과 동시에 생성 크기 지정x

        intList.add(99);
        intList.add(50);
        intList.add(12); // 값이 추가되면서 크기가 늘어난다.

        System.out.println(intList.get(1));

        intList.set(1, 77); // 값을 수정
        System.out.println(intList.get(1));
        ArrayList<Integer> intList = new ArrayList<Integer>(); // 선언과 동시에 생성

        intList.add(99);
        intList.add(50);
        intList.add(12);
        
        System.out.println(intList.get(0));
        intList.remove(0);
        System.out.println(intList.get(0));
        
        결과 : 99
              50 // remove로 값을 제거하면 뒤에 있던 값들이 앞으로 땡겨진다.

 

 

Stack

값을 수직으로 쌓아놓고 넣었다가 빼서 조회하는 형식으로 데이터를 관리하는 자료형

LIFO “나중에 들어간 것이 가장 먼저 나온다(Last-In-First-out)” 

        Stack<Integer> intStack = new Stack<>();

        intStack.push(29);
        intStack.push(7);
        intStack.push(1004); // 값을 넣어줌

        while (!intStack.isEmpty()){
            System.out.println(intStack.pop()); // 맨 위에 값을 꺼낸다.
        }
        
// 결과 : 
1004
7
29

 

Set

순서가 없고 자료의 중복을 허용하지 않는 집합으로 생성자가 없어 생성자가 존재하는 HashSet 클래스를 이용해서 생성한다.

  • 선언 : Set<Integer> intSet 
  • 생성 : new HashSet<Integer>()
  • 추가 : intSet.add({추가할 값}) 
  • 조회 : intSet.get({조회 할 순번}) 
  • 삭제 : intSet.remove({삭제할 값}) 
  • 포함확인 : intSet.contains({포함확인 할 값}) - 해당값이 포함되어 있는지 boolean 값으로 응답

 

Map

key-value 구조로 key값은 중복을 허용하지 않는다.

  • 선언 : Map<String, Integer> intMap
  • 생성 : new HashMap<>()
  • 추가 : intMap.put({추가할 Key값},{추가할 Value값})
  • 조회 : intMap.get({조회할 Key값}) 
  • 전체 key 조회 : intMap.keySet() -  Map의 모든 Key를 모아서 Set 자료형으로 리턴
  • 전체 value 조회 : intMap.values() - Map의 모든 Value를 모아 Set 자료형으로 리턴
  • 삭제 : intMap.remove({삭제할 Key값})

 

 

연습

자료구조 요리 레시피 메모장 만들기

  • 입력값
    • 저장할 자료구조명을 입력합니다. (List / Set / Map)
    • 내가 좋아하는 요리 제목을 먼저 입력합니다.
    • 이어서 내가 좋아하는 요리 레시피를 한 문장씩 입력합니다.
    • 입력을 마쳤으면 마지막에 “끝” 문자를 입력합니다.
  • 출력값
    • 입력이 종료되면 저장한 자료구조 이름과 요리 제목을 괄호로 감싸서 먼저 출력해줍니다.
    • 이어서, 입력한 모든 문장 앞에 번호를 붙여서 입력 순서에 맞게 모두 출력해줍니다. 

 

내가 작성한 코드 일부

        switch (type) {
            case "List" :
                boolean flag = true;
                ArrayList<String> recipeArr = new ArrayList<>();

                while (flag) {
                    String recipe = sc.nextLine();

                    recipeArr.add(recipe);

                    if(recipe.equals("끝")) {
                        flag = false;
                    }
                }
                System.out.println("[ " + type + "으로 저장된 " + title + " ]");
                for(String item : recipeArr) {
                    System.out.println(item);
                }
                break;

 

정답 코드 일부

		switch (collectionName) {
			case "List":
				ArrayList<String> strList = new ArrayList<>();
				while (true) {
					// 한줄씩 입력받아서 strList 에 저장
					String text = sc.next();
					if (Objects.equals(text, "끝")) {
						break;
					}
					strList.add(text);
				}

				title = "[ List로 저장된 " + title + " ]";  // [ 제목 ]
				System.out.println(title);
				// strList 한줄씩 출력
				for (int i = 0; i < strList.size(); i++) {
					int number = i + 1;
					System.out.println(number + ". " + strList.get(i));
				}
				break;

알게 된 점

  • "끝"을 입력받았을 때 boolean 변수를 false로 바꿔서 while문을 빠져나왔는데 정답코드를 보니 그냥 간단하게 break를 쓰면 됐었다. 아직 break가 익숙지 않아서 이런 차이가 생긴 것 같다.
  • 처음에 레시피를 next()로 받았더니 레시피를 한 줄 단위가 아닌 단어로 받아와서 nextLine()으로 수정했다. 공백을 포함한 한 줄을 온전히 받으려면 nextLine 메서드를 써야겠다.

 

 

'TIL > WEEK2' 카테고리의 다른 글

JAVA3 객체지향 프로그래밍2  (0) 2023.05.26
JAVA3 객체지향 프로그래밍1  (0) 2023.05.25
JAVA 2주차 조건문과 반복문  (0) 2023.05.23
JAVA 1주차  (0) 2023.05.22

조건문

if문과 switch문의 차이점

  1. if문은 ()안에 복수의 조건을 지정할 수 있지만 switch는 하나의 조건만 지정가능하다.
  2. 딱 보기엔 switch문이 가독성이 더 좋아 코드를 파악하기 쉽다.

 

반복문

향상된 for문

        int[] numbers = {3, 6, 9, 12, 15};

        for(int number:numbers){
            System.out.println(number + " 향상된 for문");
        }

 

위 코드를 일반적인 for문으로 구현하면 다음과 같다.

      int[] numbers = {3, 6, 9, 12, 15};

        for(int i=0; i < numbers.length; i++){
            System.out.println(numbers[i] + " ");
        }

 

향상된 for문은 자바스크립트의 forEach 메서드와 유사한 기능을 하는 듯하다.

 

 

break 명령

break 명령은 표시되는 가장 가까운 바깥쪽 루프 또는 조건문의 실행을 종료한다. 즉, 자기가 속해있는 루프에서 한겹 바깥 껍질을 탈출한다.

 for(int i=0; i<10; i++){
            System.out.println("i : " + i);
            if(i == 2){
                break; // for(int i=0; i<10; i++)를 탈출
            }
            for(int j=0; j<10; j++){
                System.out.println("j : " + j);
                if(j == 2){
                    break; // for(int j=0; j<10; j++)를 탈출
                }
            }
        }
i : 0
j : 0
j : 1
j : 2
i : 1
j : 0
j : 1
j : 2
i : 2

 

 

continue 명령

continue 아래쪽 로직을 건너뛰고 위로 올라간다.

        int num = 0;
        while(num < 3){
            num++;
            if(num == 2){
                continue; // 아래 println을 실행하지 않고 while(num < 3)으로 간다.
            }
            System.out.println("num : " + num);
        }
num : 1
num : 3

 

 

연습

구구단에서 선택한 단만 출력하기

        Scanner sc = new Scanner(System.in);
        int passNum = sc.nextInt(); // 출력할 구구단 입력받기
        for (int i = 2; i <= 9; i++) {
            if (i != passNum) {
                continue;
            }
            for (int j = 2; j <= 9; j++) {
                System.out.println(i + "곱하기" + j + "는" + (i * j) + "입니다.");
            }
        }
5 // 출력할 단 입력
5곱하기2는10입니다.
5곱하기3는15입니다.
5곱하기4는20입니다.
5곱하기5는25입니다.
5곱하기6는30입니다.
5곱하기7는35입니다.
5곱하기8는40입니다.
5곱하기9는45입니다.

 

 

 

'TIL > WEEK2' 카테고리의 다른 글

JAVA3 객체지향 프로그래밍2  (0) 2023.05.26
JAVA3 객체지향 프로그래밍1  (0) 2023.05.25
JAVA 2주차 배열과 컬렉션  (0) 2023.05.24
JAVA 1주차  (0) 2023.05.22

JVM(Java Virtual Machine )

여러가지의 기기위에 Java 프로그램을 실행시킬 수 있는 가상의 기기를 만들어주는것

 

ava 컴파일러

Java 코드(.java 파일)를 운영체제가 읽을 수 있는 바이트 코드(.class 파일)로 변환

 

인터프리터

운영체제가 읽은 바이트 코드를 기계어로 번역

 

JIT 컴파일러

인터프리터의 효율을 높여주는 서포터 해석기

 

클래스 로더

JVM으로 바이트 코드를 불러와서 메모리에 저장

 

가비지 컬렉터

메모리 영역에서 안쓰는 데이터를 주기적으로 흡수해가는 청소기

JRE의 기능

Java Runtime Environment 자바 실행 환경

  • .class 파일만 실행 가능

 

JDK의 기능

  • JRE(JVM)의 기능 : .class  파일 실행
  • Java Compiler(javac) 기능 : .java 파일을 .class 파일로 컴파일
  • JDB 기능 : 디버깅

 

 

 

 

기본형 변수

  • 모두 소문자로 시작된다
  • 비객체 타입이므로 null 값을 가질 수 없다. (기본값이 정해져 있음)
  • 변수의 선언과 동시에 메모리 생성
  • 모든 값 타입은 메모리의 스택(stack)에 저장
  • 저장공간에 실제 자료 값을 가진다.

 

참조형 변수

  • 기본형 과는 달리 실제 값이 저장되지 않고, 자료가 저장된 공간의 주소를 저장한다.
  • 즉, 실제 값은 다른 곳에 있으며 값이 있는 주소를 가지고 있어서 나중에 그 주소를 참조해서 값을 가져온다.
  • 메모리의 (heap)에 실제 값을 저장하고, 그 참조값(주소값)을 갖는 변수는 스택에 저장
  • 참조형 변수는 null로 초기화 시킬 수 있다.

String, 객체, 배열, 리스트 등등

 

 

Stack 영역 vs Heap 영역

  • Stack의 경우에는 정적으로 할당된 메모리 영역
    • 크기가 정해져 있는 변수를 저장
    • 크기가 정해져 있는 참조형 변수의 주소 값도 저장
  • Heap의 경우에는 동적으로 할당된 메모리 영역
    • 크기가 계속 늘어날 수 있는 참조형 변수의 원본을 저장

 

 

 

ASCII 코드 형변환

  • 입력한 정수를 문자로 바꿔서 출력하는 메서드
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int asciiNumber = sc.nextInt();

        char ch = (char)asciiNumber;

        System.out.println(ch);  // 입력한 글자를 출력합니다.

    }
}

 

 

  • 입력한 문자의 제일 첫 글자를 숫자로 출력하는 메서드
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int letter = sc.nextLine().charAt(0); // charAt(0) :첫번쨰 문자를 받아온다.

        int asciiNumber = (int)letter;

        System.out.println(asciiNumber);  // 입력한 글자를 출력합니다.

    }
}

 

'TIL > WEEK2' 카테고리의 다른 글

JAVA3 객체지향 프로그래밍2  (0) 2023.05.26
JAVA3 객체지향 프로그래밍1  (0) 2023.05.25
JAVA 2주차 배열과 컬렉션  (0) 2023.05.24
JAVA 2주차 조건문과 반복문  (0) 2023.05.23

+ Recent posts