Java 8일차

28735 단어 JavaJava

접근 제어자

  • 외부에 공개되는 수준을 의미
  • Java 언어에서 문법적인 접근 제한자는 public, protected, private, default 존재
    1) public : 모든 외부에서 직접 접근하거나 호출
    2) protected : 현재 클래스와 동일 패키지거나 다른 패키지이더라도 상속시 접근하거나 호출
    3) private : 현재 클래스의 {} 바깥쪽에서는 절대 접근하거나 호출 할 수 없음
    4) default : 현재 클래스와 동일한 패키지 내에서만 접근하거나 호출(접근 제어자를 쓰지 않았을 경우 default)

클래스의 접근 제한

  • 클래스는 public, default만을 선택 가능
  • public인 경우 외부에 클래스를 노출, default는 현재 패키지에서만 접근할 수 있는 클래스

필드의 접근 제한

  • 필드는 public, protected, private, default 모두 사용 가능
  • 일반적으로 private으로 만드는 경우와 상수를 표현할 때 public static으로 선언하는 것이 일반적

메소드의 접근 제한

  • 메소드는 public, protected, private, default 모두 사용 가능
  • 추상 메소드의 형태로 메소드를 만들때에는 private으로 선언할 수 없음

패키지

  • 클래스 파일들을 체계적으로 관리하도록 사용

사용자가 패키지를 만드는 경우

  • 패키지의 시작은 회사 도메인으로 함
    com.회사명.프로젝트명
  • 패키지의 맨 뒤는 주로 패키지 안에 있는 클래스들의 역할로 작성되는 경우가 많음
    com.회사명.프로젝트명.클래스역할

static

  • 모든 객체가 공유한다는 의미
  • static이 붙은 변수는 클래스 변수(static이 붙지 않은 변수는 인스턴스 변수)
  • 메모리에 우선 로드되므로 속도가 빠름
  • 메모리가 회수되지 않기 때문에 주의
  1. 변수에 적용
    • 모든 객체가 변수를 공용으로 사용

Button.java

public class Button {
    private static int count = 0; // 모든 객체가 공유하게 됨(공용 변수)

    public void click(){
        count++;
        System.out.println("고객님의 대기번호는 " + count + "입니다.");
    }
}

Static.java

public class Static1{
public static void main(String[]args) {
Button customer1 = new Button();
        customer1.click();
        customer1.click();
        customer1.click();

        Button customer2 = new Button();
        customer2.click();
}
}

  1. 블록에 적용
    • 같은 객체가 여러개 만들어지더라도 단 한번만 실행되는 블록을 만듦

Block.java

public class Block {
    static {
        System.out.println("static 블록을 테스트 합니다.");
    }

    public void print(){
        System.out.println("😁😁😁😁😁😁😁😁😁😁😁😁😁😁😁😁");
    }
}

Static.java

public class Static2 {
    public static void main(String[] args) {
        Block block1 = new Block();
        Block block2 = new Block();
        Block block3 = new Block();
        block1.print();
        block2.print();
        block3.print();
        // 모든 객체가 단 한번만 실행되는 명령을 사용할 때 : static
    }
}
  1. 메소드에 적용
    • 객체를 사용하지 않고 클래스.메소드 이름으로 접근하여 사용

AreaUI

public class AreaUI {
    // AreaUI.calcCircle();
    public static double calcCircle(double radius){
        return (radius * radius) * Math.PI;
    }
}

Static3

import java.util.Scanner;

public class Static3 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("반지름을 입력하세요.");
        double r = sc.nextDouble();
        double area = AreaUI.calcCircle(r);
        System.out.println("넓이 : " + area);
    }
}

래퍼클래스(Wrapper Class)

  • 포장하고 있는 기본 타입 값은 외부에서 변경할 수 없다.
    만약 내부의 값을 변경하고 싶다면 새로운 포장 객체를 만들어야 한다.
기본 타입포장 클래스
byteByte
CharCharacter
shortShort
intInteger
longLong
floatFloat
doubleDouble
booleanBoolean
String num = "10";
int i = Integer.parseInt(num);

박싱(Boxing) 과 언박싱(Unboxing)

  • 박싱 : 기본 타입 → 래퍼 클래스
    int num = 10;
    Integer i = new Integer(num);

  • 언박싱 : 래퍼 클래스 → 기본 타입
    int num = i.inValue();

예제)

public class Wrapper1 {
    public static void main(String[] args) {
    	// boxing
        int num1 = 100;
        Integer num2 = new Integer(num1);
        System.out.println(num2);

        int num3 = num2 + 100;
        System.out.println(num3);

        int num4 = num2.intValue();
        System.out.println(num4);

	// Unboxing
        Integer num5 = new Integer(10);
        Integer num6 = new Integer(10);
        Integer num7 = new Integer(5);

        Integer result1 = num5 + num6;
        System.out.println("result1 = " + result1);
        Integer result2 = num1 + num7;
        System.out.println("result2 = " + result2);

        // == : 값비교(같다), 객체 비교(주소 비교)
        System.out.println(num1 == num2); // 하나는 객체 하나는 데이터타입인데 결과가 나온다.
        System.out.println(num5 == num6); // 메모리 주소 비교
    }
}

제네릭(Generic)

  • 제네릭은 컬렉션, 람다식, 스트림, NIO에서 널리 사용되므로 기억!!(⭐️⭐️)

public class 클래스명 {...}
public interface 인터페이스명 {...}

제네릭을 사용하는 이유?

  • 다양한 타입의 객체의 재사용을 높일 수 있다
  • 클래스에서 사용할 타입을 외부에서 설정
  • 반복적인 코드, 불필요한 코드를 사용하지 않도록 재활용 가능
  • 강제적인 타입 변환을 발생시키지 않음

Object 클래스

Object object = 자바의 모든 객체;

  • 자바의 모든 클래스의 최상위 조상 클래스는 Object 클래스
  • 모든 타입은 Object 클래스 객체화를 시킬 수 있음
  • 기본 데이터 타입을 객체화 시킨 래퍼 타입으로 대입을 받을 수 있음

예제)

Box.java

public class Box {
  private Object obj;

  public Object getObj() {
      return obj;
  }

  public void setObj(Object obj) { // String
      this.obj = obj;
  }
}

Object1.java

public class Object1 {
  public static void main(String[] args) {
      Box box = new Box();
      box.setObj("안녕하세요"); // String
      System.out.println(box.getObj());

      box.setObj(10);
      System.out.println(box.getObj());

      Apple apple = new Apple("사과", 1000, "빨강","대구", 6);
      box.setObj(apple);

      Apple apple2 = (Apple) box.getObj();
      System.out.println(apple2);
  }
}

추상 클래스(abstract)

  • 클래스의 용도가 객체 생성 용도로 사용하지 않은 경우
  • 변수의 타입으로 선언하는 용도와 상속의 본연의 기능으로 특정한 코드를 하위 클래스로 물려주는 기능
  • 추상 메소드를 1개 이상 가지고 있음(자식 클래스에서 반드시 오버라이드 해야 하는 메소드)
  • 장점 : 하위 클래스에 어떤 메소드에 강제성을 부여할 수 있음
  • 단점 : 상속을 해야 하는 것
    - 추상 클래스는 자식 클래스에서 상속을 해야 사용 가능하기 때문에 자식 클래스는 다른 클래스를 상속 받을 수 없다.

final 키워드

  • 클래스, 변수, 메소드에서 사용할 수 있는 키워드로 변할 수 없는 상태

final 키워드

  • 상속 할 수 없음
final class A{}
class B extends A{} // 에러

final 변수

  • 값을 재할당 할 수 없음
  • 변수 → 상수
final String str = "Apple";
str = "Banana"; // 에러

final 메소드

  • 오버라이딩 할 수 없음
class A{
	final String methodA(){
		return "안녕하세요";
	}
}
public class B extends A {
	String methodA(){ // 에러
		return "반갑습니다.";
	}
}

좋은 웹페이지 즐겨찾기