객체에 대한 레퍼런스 변수 선언
객체 생성 / 초기화
객체 접근
- 객체의 멤버 접근
- 점(.) 연산자 이용
ex) [pizza.name](http://pizza.name) = “자바 피자”;
public class Circle{
int radius;
String name;
public Circle() {};
public double getArea(){
return 3.14*radius*radius;
}
public static void main(String[] args) {
Circle pizza;
pizza = new Circle();
pizza.radius = 10;
pizza.name = "자바피자";
double area = pizza.getArea();
System.out.println(pizza.name + "의 면적은 "+ area);
}
}
public class Circle{
int radius;
String name;
public Circle() {
radius = 1; name="";
};
public Circle(int r, String n) {
radius = r; name=n;
};
public double getArea(){
return 3.14*radius*radius;
}
public static void main(String[] args) {
Circle pizza = new Circle(10, "자바피자");
double area = pizza.getArea();
System.out.println(pizza.name + "의 면적은 "+ area);
}
}
public class Book {
String title;
String author;
public Book(String t) {
title =t;author="unknown";
}
public Book(String t, String a){
title=t; author=a;
}
public static void main(String[] args) {
Book littlePrince=new Book("어린왕자", "생텍쥐페리");
Book loveStory=new Book("춘향전");
System.out.println(littlePrince.title+" "+littlePrince.author);
System.out.println(loveStory.title+" "+loveStory.author);
}
}
this.member_name 형태의 사용

ㄴ 객체의 멤버 변수와 메소드 변수의 이름이 같은 경우
→ 이름을 바꿔주지 않고 객체의 멤버변수를 this.meber_name의 형식으로 써주면 이름이 같아도 구분하면서 동작함
ㄴ다른 메소드 호출 시 객체 자신의 레퍼런스를 전달할 때
return this; 사용
ㄴ 다른 메소드 호출 시 객체 자신의 레퍼런스를 반환할 때
this() 사용 / 중요 같은 클래스의 다른 생성자 호출
ㄴ 클래스 내의 다른 생성자 호출
ㄴ 생성자 내에서만 사용가능하고 반드시 생성자의 맨 첫줄에서 수행; 컴파일러가 첫문장에 두었을 떄 판단하는 뭔가가 있음
ㄴC.E 생성자의 첫 번째 문장에서 사용하지 않을 시
this(””, ””); // Book()생성자가 Book(String title, String author)생성자를 호출하게 하고 “”, ””값을 전달함
this(title, “작자미상”); //Book(String title)생성자가 Book(String title, String author)생성자를 호출하게 하고 “”, ”작자미상”값을 전달함
→ 추가적인 생성을 하는 것이 아님 결국 하나의 객체 생성
→ 값을 갱신하는 변수를 줄이기 좋음
클래스 배열에 대한 레퍼런스 변수를 선언 후 레퍼런스 배열을 new를 통해 생성해준다
중요 객체의 배열에서 배열의 원소는 객체가 아니며 객체에 대한 레퍼런스이다. 그러므로 객체 배열 생성 후 다시 원소의 개수만큼 객체를 생성해서 배열의 각 원소에 지정해야한다.
주의! 배열의 각 원소 객체를 따로 생성하고 초기화해야한다 (생성자를 통해)
public class Circle{
int radius;
String name;
public Circle() {
this(1, "");
};
public Circle(int r){
this(r,"");
}
public Circle(int r, String n) {
radius = r; name=n;
};
public double getArea(){
return 3.14*radius*radius;
}
public static void main(String[] args) {
Circle []c=new Circle[5];
for(int i = 0; i<c.length;i++)
c[i]=new Circle(i);
for(int i=0; i<c.length;i++)
System.out.println(i+"번쨰의 면적은 "+ c[i].getArea());
}
}
import java.util.Scanner;
public class Book {
String title;
String author;
public Book(){
this("","");
}
public Book(String t) {
this(t,"unknown");
}
public Book(String t, String a){
title=t; author=a;
}
public static void main(String[] args) {
Book [] book = new Book[2];
Scanner scanner = new Scanner(System.in);
for(int i=0;i<book.length;i++){
System.out.print("제목>>");
String title = scanner.nextLine();
System.out.print("저자>>");
String author = scanner.nextLine();
book[i] = new Book(title,author);
}
for(int i=0;i<book.length;i++)
System.out.print("("+book[i].title+", "+book[i].author+")");
scanner.close();
}
기본 타입의 값 전달
레퍼런스 타입의 값 (객체 혹은 배열) 전달
public class ArrayParameterEx {
static void replaceSpace(char a[]){
for(int i=0; i<a.length; i++){
if(a[i]==' ')
a[i]=',';
}
}
static void printCharArray(char a[]){
for(int i=0;i<a.length;i++)
System.out.print(a[i]);
System.out.println();
}
public static void main(String[] args) {
char c[] = {'I',' ','a','m',' ','H','o','g','e','u','n','.'};
printCharArray(c);
replaceSpace(c);
printCharArray(c);
}
}
매개변수의 개수나 타입이 서로다름
주의! 리턴 타입은 오버로딩과 관련이 없음
- 컴파일러는 메소드의 이름과 매개변수만을 검사함
예시로 print/printf/println 함수를 보면 오버로딩 된것을 볼 수 있다
가비지의 처리: main함수 내 지역변수 reference나 객체의 feild에서의 reference는 null을 넣어서 가비지 처리해주면 메모리 효과가 있을 수 있다. 함수의 지역변수에서는 효과가 거의 없다.
System.gc();
Heap 공간의 사용: JVM은 각각 하나의 APP을 관리한다. 한꺼번에 JVM이 모든 프로그램을 관리하지 않는다.
그렇기 때문에 Heap공간의 사용에 대해 프로그램 당 그렇게 크지 않은 공간을 준다. → 설정항목의 환경변수에서 힙공간을 얼마나 사용할지 바꾸어 줄 수 있다. // dialog JVM arguments 명령행 파라미터로 heap-size를 지정한다.
그러나, 현재 백엔드 개발에서는 가상 클라우드 공간을 사용하기 때문에 traffic이 몰리면 설정을 통해 공간을 늘려주기만 하면 된다. 실제로 resource는 무한대라고 생각하고 server를 구축하기도 한다.
관련 있는 클래스 파일(컴파일된 .class)을 저장하는 디렉터리(폴더)
자바 응용프로그램은 하나 이상의 패키지로 구성
이름은 소문자로 작성해준다
🟥 패키지 내부의 .java 파일들은 첫 줄에 package a;로 파일이 속한 패키지 명을 적어준다. a안의 c에 있다면 a.c와 같이 나타낸다.
🟨 src는 디폴트 패키지로 기능하며 그 위치에 클래스를 만들면 하위 패키지에 접근이 가능하지만 패키지 내부에서는 접근할 수 없다.
🟩 같은 패키지 내의 클래스끼리는 서로 일반적으로 이름으로 호출하여 사용하면 된다.
🟩 다른 패키지 내의 클래스는 package명까지 써주어야 한다. 패키지 a의 AA클래스를 사용하려면 a.AA로 호출하여햐 한다.
ex) java.vir.Scanner / java.util.Scanner의 경우 이름이 같기떄문에 풀네임을 사용해야한다.
package Chapter13_package1;
import Chapter13_package2.PackageTest2;
//Chapter13_package1과 Chapter13_package2는
//둘다 PackageTest라는 같은 이름의 클래스를 사용한다
public class PackageTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
// Chapter13_package2 의 PackageTest 클래스를 사용
// 클래스 충돌이 발생하기 때문에 패키지를 명시 필요
Chapter13_package2.PackageTest pk = new Chapter13_package2.PackageTest();
pk.package_function();
// Chapter13_package2 의 PackageTest2 클래스를 사용
// import 를 해주었기 때문에 클래스명만 사용
PackageTest2 pt2 = new PackageTest2();
pt2.package_function();
// Chapter13_package1 의 PackageTest 클래스를 사용
// 클래스 명을 작성하지 않으면 현재 패키지의 클래스를 참조
package_function();
}
public static void package_function() {
System.out.println("패키지1 의 함수");
}
}
다른 클래스에서 사용하도록 허용할 지 지정
public 클래스
디폴트 클래스
- package-private라고도 함
- 같은 패키지의 클래스에만 접근 허용
- ex) class Local { … }
public 멤버
private 멤버
protected 멤버
default 멤버
- 같은 패키지 내의 다른 클래스에게 접근 허용
class Sample {
public int a;
private int b;
int c;
}
public class AccessEx {
public static void main(String[] args) {
Sample aClass = new Sample();
aClass.a = 10;
aClass.b = 10;
aClass.c = 10;
}
}
class Calc{
public static int abs(int a) { return a>0?a:-a; }
public static int max(int a,int b){ return (a>b)?a:b; }
public static int min(int a, int b){ return (a>b)?b:a; }
}
public class CalEx {
public static void main(String[] args) {
System.out.println(Calc.abs(-5));
System.out.println(Calc.max(10,8));
System.out.println(Calc.min(-3,-8));
}
}
객체가 생성되지 않은 상황에서도 static 메소드는 실행될 수 있기 때문에 non-static 메소드와 필드 사용 불가
반대로, non-static메소드는 static멤버 사용 가능
주의! main함수도 static메소드이기 때문에 인스턴스 변수 사용 불가!!
this.이 명시적으로 써져있지 않아도 본인의 필드를 가리킬때 this.이 있다고 생각!
static 메소드에서 객체를 생성하고나면 non-static에 접근할 수 있음
마찬가지로 객체가 생성되지 않은 상황에서도 호출이 가능하므로 현재 객체를 가리키는 this 사용 불가능
import java.util.Scanner;
class CurrencyConverter {
private static double rate;
public static double toDollar(double won){
return won/rate;
}
public static double toKWR(double dollar){
return dollar*rate;
}
public static void setRate(double r){
rate = r;
}
}
public class StaticMember {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("환율(1달러)>> ");
double rate = scanner.nextDouble();
CurrencyConverter.setRate(rate);
System.out.println("백만원은 $"+CurrencyConverter.toDollar(100_0000)+"입니다.");
System.out.println("$100는 "+CurrencyConverter.toKWR(100)+"원입니다.");
scanner.close();
}
}
상수를 선언할 때 사용
주의! 필드 선언: (접근지정자) (static) (final) (type) 변수명
상수 필드는 선언 시에 초기 값을 지정해야 한다
상수 필드는 실행 중에 값을 변경할 수 없다
지역변수에는 접근지정자와 static을 사용하지 않는다!
https://believed-poinsettia-f0f.notion.site/4-ee015a23d2424e419cc971b8cdbc5db0?pvs=4