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

차재현·2024년 12월 24일
0

[ Backend Study - Java ]

목록 보기
3/11
post-thumbnail

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

Section 4. 생성자

Chapter 1. 생성자가 필요한 이유

  • 우리는 Class 자료형을 선언한 뒤, 멤버변수를 초기화해주어야 한다.
  • 멤버 변수를 초기화한다는 것도 결국엔 Class의 속성을 다루는 것 이기에
    초기화하는 기능도 Class에서 메서드로서 제공해야 한다는 것이다!
  • 이러한 기능을 하는 메서드를 생성자라고 한다

Chapter 2. "this"

  • 생성자 예제 코드
    // MemberInit.java
    package construct;
    
    public class MemberInit {
    	String name;
    	int age;
    	int grade;
    	
    	void initMember(String name, int age, int grade) {
    		this.name = name;
    		this.age = age;
    		this.grade = grade;
    	}
    }
    // MethodInitMain3.java
    package construct;
    
    public class MethodInitMain3 {
    	public static void main(String[] args) {
    		MemberInit member1 = new MemberInit();
    		member1.initMember("user1", 15, 90);
    		MemberInit member2 = new MemberInit();
    		member2.initMember("user2", 16, 80);
    		
    		MemberInit[] members = {member1, member2};
    		
    		for (MemberInit s : members) {
    			System.out.println("이름:" + s.name + " 나이:" + s.age + " 성적:" +
    			s.grade);
    		}
    	}
    }
    • initMember 메서드를 보면 this. 가 있다. 이 this. 는 객체 자신의 참조값을 가리킨다.
    • 즉, initMember는 매개변수의 값을 받아와 객체 자신의 참조값의 멤버변수에 대입한다.

Chapter 3. "this"의 생략

  • 만약 initMember에서 this를 생략하게되면 매개변수 = 매개변수 와 같은 모양이 되어 멤버변수의 값이 변경되지 않는다.
  • 하지만 this를 생략할 수 있는 방법은 있다. 바로 매개변수의 이름을 다르게 하는 것이다.
    • 이 경우 변수를 찾을 때 가까운 지역변수(매개변수도 지역변수다)를 먼저 찾고 없으면
      그 다음 으로 멤버 변수를 찾는다. 멤버 변수도 없으면 오류가 발생한다.
  • this 생략 예제코드
    package construct;
    
    public class MemberThis {
    	String nameField;
    	
    	void initMember(String nameParameter) {
    		nameField = nameParameter; // 코드 A
    	}
    }
    • 코드 A가 실행될 때
      • nameField는 먼저 지역변수(매개변수)에서 같은 이름이 있는지 찾는다.
        이 경우 없으므로 멤버 변수에서 찾는다.
      • nameParameter는 먼저 지역변수(매개변수)에서 같은 이름이 있는지 찾는다.
        이 경우 매개변수가 있으므로 매개변수를 사용한다.
  • this를 써야하나 말아야 하나?
    • 위의 예제를 통해 알 수 있듯이, 생략해도 되고 그냥 사용해도 된다.
    • 사용하는 경우의 장점으로는 이 변수가 멤버변수임을 확인하기 좋다는 것이다.

Chapter 4. 생성자 호출

  • 생성자는 인스턴스를 생성하고나서 즉시 호출된다.
    package construct;
    
    public class ConstructMain1 {
    	public static void main(String[] args) {
    		MemberConstruct member1 = new MemberConstruct("user1", 15, 90);
    		MemberConstruct member2 = new MemberConstruct("user2", 16, 80);
    		MemberConstruct[] members = {member1, member2};
    		
    		for (MemberConstruct s : members) {
    			System.out.println("이름:" + s.name + " 나이:" + s.age + " 성적:" +
    			s.grade);
    		}
    	}
    }
    • 여기서는 MemberConstruct 인스턴스를 생성하고
      바로MemberConstruct(String name, int age, int grade) 생성자를 호출한다.
    • 참고로 new 키워드를 사용해서 객체를 생성할 때 마지막에 괄호 () 도 포함해야 하는 이유가 바로 생성자 때문이다. 객체를 생성하면서 동시에 생성자를 호출한다는 의미를 포함한다.

Chapter 5. 생성자 사용 장점

  • 객체를 생성할 때 직접 정의한 생성자가 있다면 직접 정의한 생성자를 반드시 호출해야 한다.
    • 직접 정의한 생성자를 호출하지 않으면 컴파일 오류가 발생한다.
    • 빈 객체가 생성되어 사용되는 일을 방지한다.

Chapter 6. 기본 생성자 new “Type”()

  • 매개변수가 없는 생성자
  • 클래스에 생성자가 하나도 없으면 자바 컴파일러는
    • 매개변수가 없고

    • 작동하는 코드가 없는

      기본 생성자를 자동으로 만들어준다. (우리 눈에 보이지는 않는다.)

  • 생성자가 하나라도 있으면 자바는 기본 생성자를 만들지 않는다.
  • 기본 생성자를 왜 자동으로 만들어줄까?
    • 만약 자바에서 기본 생성자를 만들어주지 않는다면
      생성자 기능이 필요하지 않은 경우에도 모든 클래스에 개발자가 직접 기본 생성자를 정의해야 한다.
    • 생성자 기능을 사용하지 않는 경우도 많기 때문에 이런 편의 기능을 제공한다.

Chapter 7. 생성자의 오버로딩과 this()

  • 생성자 메서드도 오버로딩처럼 매개변수만 다르게하여 여러 생성자를 제공할 수 있다.
  • 생성자와 this()
    • this() 기능을 사용하면 생성자 내부에서 자신의 생성자를 호출할 수도 있다.
    • this()는 인스턴스 자신의 참조값을 가리키기에 이를 이용한 것이다.
      • 생성자의 이름은 클래스의 이름과 같다는 점을 잊지말자.
    • 예제 코드
      package construct;
      
      public class MemberConstruct {
      	String name;
      	int age;
      	int grade;
      	
      	MemberConstruct(String name, int age) {
      		this(name, age, 50); // == MemberConstruct(name, age, 50)
      	}
      	
      	MemberConstruct(String name, int age, int grade) {
      		this.name = name;
      		this.age = age;
      		this.grade = grade;
      		System.out.println("생성자 호출 name=" + name + ",age=" + age + ",grade=" +
      		grade);
      	}
      }
      • this(name, age, 50)는 첫번째 생성자 내부에서 두번째 생성자를 호출한다.
    • this() 규칙
      • this()생성자 코드의 첫줄에만 작성할 수 있다. (다른 생성자를 호출하는 this 임을 잊지 말자)
      • 만약 this()가 생성자 코드의 첫줄에 있지 않다면 컴파일 오류가 발생!

Section 5. 패키지

Chapter 1. 패키지란?

  • Java에서의 폴더, 디렉토리 개념

Chapter 2. 패키지 사용법

  • 예제 코드
    package pack; //***
    
    public class PackageMain1 {
    		public static void main(String[] args) {
    			Data data = new Data();
    			pack.a.User user = new pack.a.User();
    	}
    }
  • 패키지를 사용하는 경우 항상 코드 첫줄package 패키지명 과 같이 패키지 이름을 적어주어야 한다.
  • 사용자와 같은 위치
    • Data 는 pack 패키지에 위치한다.
    • 같은 패키지에 있는 경우에는 패키지 경로를 생략해도 된다.
  • 사용자와 다른 위치
    • User 는 pack.a 패키지에 위치한다.
    • 패키지가 다르면 패키지 전체 경로를 포함해서 클래스를 적어주어야 한다.

Chapter 3. 패키지 - import

  • 예제 코드
    package pack;
    
    import pack.a.User;
    
    public class PackageMain2 {
    	public static void main(String[] args) {
    		Data data = new Data();
    		User user = new User(); //import 사용으로 패키지 명 생략 가능
    	}
    }
    • 다른 패키지의 경로를 적는것은 불편하기에 import 를 사용할 수 있다.
    • package 다음줄에서 사용할 수 있다.
  • 특정 패키지에 포함된 모든 클래스를 사용하고 싶다면 * (star)를 사용하면 된다.
    package pack;
    
    import pack.a.*;
    
    public class PackageMain2 {
    	public static void main(String[] args) {
    		Data data = new Data();
    		User user = new User(); //import 사용으로 패키지 명 생략 가능
    	}
    }
    • 이때도, pack.a 패키지 하위의 다른 패키지들의 클래스까지 가져오는게 아니라
      pack.a 패키지의 클래스”만” 모두 가져오는 것이다.
    • pack.a 패키지 하위의 패키지라고해도 엄연히 다른 패키지이기 때문이다!

Chapter 4. 클래스 이름 중복

  • 만약 다른 패키지에 중복되는 이름의 클래스를 사용해야 하는 경우
    pack.a.User
    pack.b.User
    • 같은 이름의 클래스가 있다면 import하나만 선택이 가능하다.
    • 따라서 자주 사용하는 클래스를 import하고 나머지는 코드 상에서 패키지 경로를 적어야 한다.

Chapter 5. 패키지 규칙

  • 패키지의 이름과 위치는 폴더(디렉토리) 위치와 같아야 한다. (필수)
  • 패키지 이름은 모두 소문자를 사용한다. (관례)
  • 패키지 이름의 앞 부분에는 일반적으로 회사의 도메인 이름을 거꾸로 사용한다.
    예를 들어, com.company.myapp 과 같이 사용한다. (관례)
    - 이 부분은 필수는 아니다. 하지만 수 많은 외부 라이브러리가 함께 사용되면 같은 패키지에 같은 클래스 이름이 존재할 수도 있다.
    - 이렇게 도메인 이름을 거꾸로 사용하면 이런 문제를 방지할 수 있다.
    - 내가 오픈소스나 라이브러리를 만들어서 외부에 제공한다면 꼭 지키는 것이 좋다.
    - 내가 만든 애플리케이션을 다른 곳에 공유하지 않고, 직접 배포한다면 보통 문제가 되지 않는다.
    - ex) 구글의 경우 기본 주소 : google.com
    → 구글회사에서 만든 패키지 이름 = com.google.myapp

Chapter 6. 패키지와 계층구조

  • 패키지는 보통 계층 구조를 이룬다
    • package a
      - package b
      - package c

      이렇게 하면 보통 a.b 패키지와 a.c 패키지는 a 패키지에 속해있는것 같이 보이지만,
      서로 완전히 다른 패키지이다.

  • 즉, 다른 패키지의 클래스를 사용하기 위해서는 무조건 패키지 경로를 작성하거나 import하여 사용해야 한다.

💡 패키지를 구성할 때 서로 관련된 클래스는 하나의 패키지에 모으고,
관련이 적은 클래스는 다른 패키지로 분리하는 것이 좋다.

profile
Develop what? and why?

0개의 댓글