Java 8일차
접근 제어자
- 외부에 공개되는 수준을 의미
- 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이 붙지 않은 변수는 인스턴스 변수)
- 메모리에 우선 로드되므로 속도가 빠름
- 메모리가 회수되지 않기 때문에 주의
- 변수에 적용
- 모든 객체가 변수를 공용으로 사용
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();
}
}
- 블록에 적용
- 같은 객체가 여러개 만들어지더라도 단 한번만 실행되는 블록을 만듦
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
}
}
- 메소드에 적용
- 객체를 사용하지 않고 클래스.메소드 이름으로 접근하여 사용
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)
- 포장하고 있는 기본 타입 값은 외부에서 변경할 수 없다.
만약 내부의 값을 변경하고 싶다면 새로운 포장 객체를 만들어야 한다.
기본 타입 | 포장 클래스 |
---|---|
byte | Byte |
Char | Character |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
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 "반갑습니다.";
}
}
Author And Source
이 문제에 관하여(Java 8일차), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@soyounjeong/Java-8일차저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)