extends object
라는 코드를 컴파일러가 자동으로 추가해준다클래스들의 묶음
클래스의 실제이름은 패키지까지 포함한다
클래스는 물리적으로 하나의 .class
즉 클래스파일인것과 같이 패키지는 물리적으로는 하나의 디렉터리를 의미한다
하나의 소스파일에는 첫번째 문장으로 단 한번의 패키지 선언만 허용 package 패키지명;
모든 클래스는 반드시 하나의 패키지에 속해야한다
만약 패키지를 지정하지 않으면 이름없는 패키지에 속하게된다
아주 긴 패키지명.클래스명
을 사용하여 매번 클래스를 사용할때 긴 이름을 사용해야한다.import
를사용하면 컴파일러에게 패키지명을 알려주는거와 다름없어서import java.util.*;
import java.text.*;
//import java.*;
import static java.lang.Math.random;
//System.out.println(Math.random());
System.out.println(random());//Math 생략
public class Main{
//final 클래스-> 자식 클래스 정의못함
//final을 붙여야 컴파일시점에 오류를 잡을 수 있음
public final class Singleton{
//싱글톤 클래스가 내부클래스이기때문에 외부클래스 인스턴스를 생성해주든지
//static으로 class를 선언하든지 해줘야함
private static Main main = new Main();
//static으로 변수를 선언해줘서 클래스의 인스턴스 생성없이도
//그러니까 인스턴스 생성전에 클래스를 만드는것만으로도 인스턴스하나를 생성해서 가지고있어야함
private static Singleton s = main.new Singleton();
//외부로의 접근을 막는다 위코드에서 만든 인스턴스를 제외하고는 추가 인스턴스를 만들 수 없다
private Singleton(){
}
//해당 메서드로만 인스턴스로의 접근이 가능하게하고 하나의 인스턴스를 매번 재활용해서 사용한다
public static Singleton getInstance(){
return s;
}
}
}
참조변수타입만큼 참조를 할 수 있고
인스턴스 타입만큼의 메모리가 확보된다
인스턴스타입을 자식만큼해도 참조변수를 부모로하면 부모만큼밖에 참조를 못한다
Parent p = new Child();//error 작은것 <- 큰것일때 error발생
Child c = new Parent();
Child c2 = (Child) p;//자식 참조변수가 자식 인스턴스가리킴
Parent p2 = (Parent) c;//부모 참조변수가 부모 인스턴스가리킴
public static vodi main(){
Parent p = new Child();
Child c = new Child();
System.out.println(p.x);//100
p.print();//"자식"
System.out.println(c.x);//200
c.print();//"자식"
}
class Parent{
int x = 100;
void print(){
System.out.println("부모");
}
}
class Child{
int x = 200;
void print(){
System.out.println("자식");
}
}
public class Item{
int price;
}
public class Tv extends Item{}
public class Computer extends Item{}
public class Person{
int money = 1000;
public int buyTv(Tv tv){
return money-tv.price;
}
public int buyComputer(Computer computer){
return money-computer.price;
}
//앞의 두 메서드를 하나의 메서드로 처리가능
public int buy(Item item){
return money-item.price;
}
}
fightable을 구현한 fighter class가 있다고 가정하다
Fightable f = new Fighter();//가능
public void attach(Fightable f){...}//매개변수로도 사용가능
public Fightable method(){...}//리턴타입으로 정의하는것도 가능
//Fightable 을 구현한 구현체의 인스턴스를 넘겨주어야함
return타입이 인터페이스라는것은?
class A{
public void print(B b){
b.print();
}
}
class B{
public void print(){
System.out.println("BB");
}
}
class A{
//B와의 직접적인 연관이 끊어졌다
public void print(I i){
i.print();
}
}
class B implements I{
public void(){
System.out.println("BB");
}
}
//추가적인 클래스
class C implements I{
public void(){
System.out.println("CC");
}
}
interface C {
default void print(){
System.out.println("C");
}
}
interface B extends C{
default void print(){
System.out.println("B");
}
}
static class Fighter implements B{
}
public static void main(String[] args) throws IOException {
Fighter ff = new Fighter();
ff.print();//"B"
}
interface C {
default void print(){
System.out.println("C");
}
}
interface B extends C{
default void print(){
System.out.println("B");
}
}
static class Fighter implements B{
//추가된 코드
public void print(){
System.out.println("Fighter");
}
}
public static void main(String[] args) throws IOException {
Fighter ff = new Fighter();
ff.print();//"Fighter"
}
선언된 위치에 따라 구분할 수 있다
import java.io.*;
import java.lang.reflect.Array;
import java.nio.Buffer;
import java.util.ArrayList;
import java.util.Arrays;
public class Main{
static class outerClass{
class innerClass{
int x1;
static int x2 = 2;
}
static class staticInnerClass{
int x1 = 1;
static int x2 = 2;
}
public static void print(){
System.out.println(innerClass.x2);
}
}
public static void main(String[] args) throws IOException {
outerClass class1 = new outerClass();
outerClass.innerClass class2 = class1.new innerClass();
class2.x1 = 2;
outerClass.innerClass class4 = class1.new innerClass();
class4.x1 = 4;
System.out.println(class2.x1);
System.out.println(class4.x1);
}
}
출력결과 2 와 4 가 나온다.
import java.io.*;
import java.lang.reflect.Array;
import java.nio.Buffer;
import java.util.ArrayList;
import java.util.Arrays;
public class Main{
static class outerClass{
int x;
class innerClass{
int x1;
static int x2 = 2;
}
static class staticInnerClass{
int x1 = 1;
static int x2 = 2;
}
public static void print(){
System.out.println(innerClass.x2);
}
}
public static void main(String[] args) throws IOException {
outerClass class1 = new outerClass();
class1.x = 2;
outerClass class2 = new outerClass();
class2.x = 3;
System.out.println(class1.x);
System.out.println(class2.x);
}
}
출력결과 2와 3이나온다
static의 내부에 있다고 무조건 다 static이 되는것이 아니다.
class단위에 static이 붙는다는것은 외부클래스 참조없이 만들수있다! 만을 의미하는것가탇
Main없이 new로 바로 outerClass를 생성할 수 있는 그정도의 의미를 갖고있는것같다
그래서 다음코드도 false가 나온다.
static class는 인스턴스가 생성되는영역인 heap에 생긴다
static영역에 생기지않는다
외부클래스명$숫자.class
라는 이름으로 클래스파일이름이 결정된다https://brunch.co.kr/@kd4/6
https://myjamong.tistory.com/150