[1/8] Java 기본 Summary ( w. 인프런 김영한)

차재현·2024년 12월 24일
0

[ Backend Study - Java ]

목록 보기
2/11
post-thumbnail

인프런 웹 사이트의 김영한 강사님 강의를 들으며 학습한 Java 기본편 내용을 요약해 보도록 하겠습니다!

Section 1. 클래스

  • 클래스 : 관련이 있는 정보끼리의 모음을 위한 틀
    • 클래스 작명법은 대문자로 시작하는 Camel Case!
  • 예제 코드
    // Student.java
    package class1;
    
    public class Student {
    	String name;
    	int age;
    	int grade;
    }
    // ClassStart.java
    package class1;
    
    public class ClassStart {
    	public static void main(String[] args) {
    		Student student1 = new Student();
    		student1.name = "학생1";
    		student1.age = 15;
    		student1.grade = 90;
    		
    		Student student2 = new Student();
    		student2.name = "학생2";
    		student2.age = 16;
    		student2.grade = 80;
    		
    		System.out.println("이름:" + student1.name + " 나이:" + student1.age + " 성
    		적:" + student1.grade);
    		System.out.println("이름:" + student2.name + " 나이:" + student2.age + " 성
    		적:" + student2.grade);
    	}
    }
    • Class를 사용하기위해선, 같은 패키지안에서 Class를 만들어야한다.
    • 위에서는 class1 이라는 패키지 안에 Student.java 파일과 ClassStart.java 파일 2개가 존재한다.
    • 같은 패키지안에 존재하는 java 파일 내부의 Class는 다른 파일에서 바로 사용할 수 있다!
  • 객체 : Class 자료형을 통해 실제 메모리에 만들어진 데이터 실체
    • Student.java 파일을 통해 ClassStart.java에서는 student1과 student2 객체가 만들어졌다.
  • 객체 또한 참조형 변수이다.
    • student1 객체는
      • string name = “학생1”

      • int age=15

      • int grade=90

        이렇게 3가지 정보의 크기 만큼의 만들어진 메모리의 주소값을 가진다.

  • 참조값을 변수에 보관해야 하는 이유
    • 객체를 생성하는 new Student() 코드 자체에는 아무런 이름이 없다.
      이 코드는 단순히 Student 클래스를 기반으로 메모리에 실제 객체를 만드는 것이다.
    • 따라서 생성한 객체에 접근하기 위해 변수에 보관해야 한다.

[ 객체, 인스턴스 정리 ]

  • 객체 vs 인스턴스
    • 둘다 클래스에서 나온 실체라는 의미에서 비슷하게 사용되지만, 용어상 인스턴스는 객체보다 좀 더 관계에 초점을 맞춘 단어이다.

    • 보통 “ student1Student 의 객체이다.” 라고 말하는 대신
      student1Student 의 인스턴스이다.” 라고 특정 클래스와의 관계를 명확히 할 때
      인스턴스라는 용어를 주로 사용한다.


    • 하지만 둘다 클래스에서 나온 실체라는 핵심 의미는 같기 때문에 보통 둘을 구분하지 않고 사용한다.

Section 2. 기본형과 참조형

Chapter 1. 변수와 초기화

  • 변수의 종류
    • 멤버 변수 : 클래스에 선언된 변수
    • 지역 변수 : 메서드에서 선언된 변수, 매개변수도 지역 변수의 한 종류이다.
  • 변수의 값 초기화
    • 멤버 변수 : 자동 초기화
      • 객체의 멤버 변수는 인스턴스를 생성할 때 자동으로 초기화된다.
        • 숫자( int ) = 0 ,
        • boolean = false
        • 참조형 = null (null 값은 참조할 대상이 없다는 뜻으로 사용된다.)
          • 멤버변수 중에서 또 다른 Class 자료형을 가지는 변수의 경우, null 값으로 초기화된다.
      • 개발자가 초기값을 직접 지정할 수 있다.
    • 지역 변수 : 수동 초기화
      • 지역 변수는 항상 직접 초기화해야 한다.
  • 기본형 변수는 null 값을 할당 할 수 없다.
  • 멤버변수 - 참조형의 null 자동 초기화 예시 코드
    // VariableInit.java
    package init.ex;
    
    public class VariableInit {
    	int a;
    }
    // Student.java
    package init.ex;
    
    public class Student{
    	String name;
    	int age;
    	int grade;
    	VariableInit vi;
    }
    // ClassStart.java
    package init.ex;
    
    public class ClassStart{
    	public static void main(String[] args) {
    		Student student1;
    		System.out.println(student1.vi); // 출력 결과 : null
    	}
    }
    • 위처럼 (Student 클래스의)멤버변수에서 또 다시 Class 자료형(VariableInit 클래스)을 사용할 때, VariableInit 클래스가 초기화 되지 않았기에 우선 자동으로 참조값이 null로 초기화 된다.

Section 3. 객체 지향 프로그래밍

Chapter 1. 절차 지향 vs 객체 지향

  • 절차 지향 프로그래밍
    • 실행 순서를 중요하게 생각하는 방식
    • 프로그램의 흐름을 순차적으로 따르며 처리하는 방식
  • 객체 지향 프로그래밍
    • 실제 세계의 사물이나 사건을 객체로 보고, 이러한 객체들 간의 상호작용을 중심으로 프로그래밍하는 방식
    • 세상의 모든 사물을 단순하게 추상화하여 속성(데이터)기능(메서드) 딱 2가지로 설명하여 관리하는 것을 지향하는 방식
  • 절차 지향과 객체 지향의 차이
    • 절차 지향은 데이터와 해당 데이터에 대한 처리 방식이 분리되어 있다.
    • 반면 객체 지향에서는 데이터와 그 데이터에 대한 행동(메서드)하나의 '객체' 안에 함께 포함되어 있다.
  • 지금까지 배운 프로그래밍은 모두 절차 지향식..!
    • 예제 코드 - 절차 지향식 음악 플레이어 코드
      // MusicPlayerData.java
      package oop1;
      
      public class MusicPlayerData {
      	int volume = 0;
      	boolean isOn = false;
      }
      // MusicPlayerMain3.java
      package oop1;
      
      public class MusicPlayerMain3 {
      	public static void main(String[] args) {
      		MusicPlayerData data = new MusicPlayerData();
      		//음악 플레이어 켜기
      		on(data);
      		//볼륨 증가
      		volumeUp(data);
      		//볼륨 증가
      		volumeUp(data);
      		//볼륨 감소
      		volumeDown(data);
      		//음악 플레이어 상태
      		showStatus(data);
      		//음악 플레이어 끄기
      		off(data);
      	}
      	
      	static void on(MusicPlayerData data) {
      		data.isOn = true;
      		System.out.println("음악 플레이어를 시작합니다");
      	}
      	
      	static void off(MusicPlayerData data) {
      		data.isOn = false;
      		System.out.println("음악 플레이어를 종료합니다");
      	}
      	
      	static void volumeUp(MusicPlayerData data) {
      	data.volume++;
      	System.out.println("음악 플레이어 볼륨:" + data.volume);
      	}
      	
      	static void volumeDown(MusicPlayerData data) {
      		data.volume--;
      		System.out.println("음악 플레이어 볼륨:" + data.volume);
      	}
      	
      	static void showStatus(MusicPlayerData data) {
      		System.out.println("음악 플레이어 상태 확인");
      		if (data.isOn) {
      			System.out.println("음악 플레이어 ON, 볼륨:" + data.volume);
      		} else {
      			System.out.println("음악 플레이어 OFF");
      		}
      	}
      }
    • 위 예제 코드를 보면 데이터와 기능이 분리되어있다.
    • 데이터는 MusicPlayerData 클래스에, 기능은 MusicPlayerMain3에 말이다.

❗ 데이터와 그 데이터를 사용하는 기능은 매우 밀접하게 연관되어 있다.
각각의 메서드를 보면 대부분MusicPlayerData 의 데이터를 사용한다.
따라서 이후에 관련 데이터가 변경되면 MusicPlayerMain3 부분의 메서드들도 함께 변경해야 한다.

즉, 데이터와 기능이 분리되어 있으면 유지보수 관점에서도 관리 포인트가 2곳으로 늘어난다.

Chapter 2. 음악 플레이어 코드를 객체지향으로 바꿔보자

  • 예제 코드 - 객체 지향식 음악 플레이어 코드
    // MusicPlayer.java
    package oop1;
    
    public class MusicPlayer {
    	int volume = 0;
    	boolean isOn = false;
    	
    	void on() {
    		isOn = true;
    		System.out.println("음악 플레이어를 시작합니다");
    	}
    	
    	void off() {
    		isOn = false;
    		System.out.println("음악 플레이어를 종료합니다");
    	}
    	
    	void volumeUp() {
    		volume++;
    		System.out.println("음악 플레이어 볼륨:" + volume);
    	}
    	
    	void volumeDown() {
    		volume--;
    		System.out.println("음악 플레이어 볼륨:" + volume);
    	}
    	
    	void showStatus() {
    		System.out.println("음악 플레이어 상태 확인");
    		if (isOn) {
    			System.out.println("음악 플레이어 ON, 볼륨:" + volume);
    		} else {
    			System.out.println("음악 플레이어 OFF");
    		}
    	}
    }
    // MusicPlayerMain.java
    package oop1;
    /**
    * 객체 지향
    */
    public class MusicPlayerMain4 {
    	public static void main(String[] args) {
    		MusicPlayer player = new MusicPlayer();
    		//음악 플레이어 켜기
    		player.on();
    		//볼륨 증가
    		player.volumeUp();
    		//볼륨 증가
    		player.volumeUp();
    		//볼륨 감소
    		player.volumeDown();
    		//음악 플레이어 상태
    		player.showStatus();
    		//음악 플레이어 끄기
    		player.off();
    	}
    }
  • 객체 지향의 장점
    • 캡슐화
      • 멤버변수와 해당 메서드를 하나로 묶어서, 메서드를 통해서만 필요한 기능을 외부에 제공하는 것

[ 객체 지향 vs 절차 지향 - 정리 ]

  • 객체 지향 프로그래밍은 모든 사물을 속성기능을 가진 객체로 생각하는 것이다.
    객체에는 속성과 기능만 존재한다.
  • 이렇게 단순화하면 세상에 있는 객체들을 컴퓨터 프로그램으로 쉽게 설계할 수 있다.
    이런 장점들 덕분에 지금은 객체 지향 프로그래밍이 가장 많이 사용된다.
  • 참고로 실세계와 객체가 항상 1:1로 매칭되는 것은 아니다.
  • 객체 지향의 특징은 속성과 기능을 하나로 묶는 것 뿐만 아니라 캡슐화, 상속, 다형성, 추상화, 메시지 전달
    같은 다양한 특징들이 있다. 앞으로 이런 특징들을 하나씩 알아가보자.
profile
Develop what? and why?

0개의 댓글