목차
1. 클래스 기본과 객체 생성
2. 생성자(constructor)
3. 인스턴스 변수와 클래스 변수
4. this 키워드
5. static 키워드
6. 자바의 접근 제어와 private 키워드
7. 자료형으로서의 클래스
8. 인스턴스 배열
9. 클래스 예제들
1. 클래스 기본과 객체 생성
- 자바 프로그램에서는 모든 것이 클래스를 통하여 작성한다. 클래스는 객체를 만드는 기본 도구라고 할 수 있다.
//클래스 예제
차(Car)클래스: - 속성: 차종, 색상, 연식,...
- 메소드: 달리기, 속도 올리기, 속도 줄이기, 멈추기,...
- 클래스를 만들고 그 클래스가 생성하는 객체들을 '인스턴스(instance)'라고 한다.
public class Car {
String kind;
String color;
int year;
void run( ) {
System.out.println("car is running.");
}
void speedUp( ) {
System.out.println("car is speeding up.");
}
}
------------------------------------------------------
public class Code_93 {
public static void main(String[] args) {
Car myCar = new Car( );
myCar.kind = "Sonata";
myCar.color = "white";
myCar.year = 2015;
Car yourCar = new Car( );
yourCar.kind = "Pride";
yourCar.color = "blue";
yourCar.year = 2017;
myCar.run( );
yourCar.run( );
myCar.speedUp( );
yourCar.speedUp( );
}
}
//결과값
car is running.
car is running.
car is speeding up.
car is speeding up.
- java 파일에 하나의 클래스를 넣고 코딩했으나, 클래스를 여개를 작성하고 수행함.(Car클래스, Code91 클래스)
- 파일명은 클래스명과 일치해야 한다.
> 파일에 클래스가 한 개 있는 경우 -> 클래스명과 파일명이 일치해야 한다.
> 파일에 클래스가 여러 개 있는 경우
- 모든 클래스가 public 키워드를 갖지 않는 경우에는 어떤 클래스 명도 파일명이 될 수 있습니다.
- pulic 키워드를 갖는 클래스가 있다면 그 클래스명을 파일명으로 해야 합니다.
> 하나의 파일에 클래스가 여러 개 있는 경우, 단 한 개의 클래스에만 pulic 키워드 가 붙을 수 있다.
(모든 클래스에 public 키워드가 없을 수도 있다.)
- 객체(object)와 인스턴스(instance)
- 클래스를 작성하면 그 클래스의 객체 또는 인스턴스를 생성할 수 있다. - 속성(attribute)과 메소드(method)
class
{
string kind; |
string color; |
int year; | <- 속성: 각 인스턴스마다 갖는 데이터, 인스턴스 변수라고도 부른다.
void run(){...} |
void speedup(){...} | <- 메소드: 모든 인스턴스가 공유되고, 메소드는 어느 인스턴스가 호출했는지가 중요.
}
- 속성만 갖는 클래스
public class Dog {
String name;
int age;
}
-------------------------
public class Code_94 {
public static void main(String[] args) {
Dog happy = new Dog( );
Dog bella = new Dog( );
happy.name = "Happy";
happy.age = 3;
bella.name = "Bella";
bella.age = 2;
System.out.println("나는 강아지 두 마리를 키웁니다.");
System.out.println("한 마리는 이름이 " + happy.name + "이고, " +
happy.age + "세입니다.");
System.out.println("다른 한 마리는 이름이 " + bella.name + "이고, " +
bella.age + "세입니다.");
}
}
//결과값
나는 강아지 두 마리를 키웁니다.
한 마리는 이름이 Happy이고, 3세입니다.
다른 한 마리는 이름이 Bella이고, 2세입니다.
- 속성(인스턴스 변수)만 갖는 클래스도 가능하다.
Dog 클래스는 강아지의 이름과 나이만을 갖는 클래스이다. 그러나 대부분의 경우 클래스에는 메소드를 추가한다.
- 인스턴스를 생성하는 new 키워드
- 객체를 생성하려면 new 키워드를 사용한다.
클래스명 객체명 = new 클래스명();
public class Code_95 {
public static void main(String[] args)
{
Car myCar = new Car( );
myCar.kind = "Sonata";
myCar.color = "white";
myCar.year = 2015;
Car yourCar = new Car( );
yourCar.kind = "Pride";
yourCar.color = "blue";
yourCar.year = 2017;
System.out.println(myCar);
System.out.println(yourCar);
}
}
//결과값
chapter_07.Car@37374a5e // 메모리 Car@37374a5e에 myCar를 선언한다.
chapter_07.Car@2db7a79b // 메모리 Car@2db7a79b에 yourCar를 선언한다.
- 객체 생성과 객체 참조 변수
public class Car {
String kind;
String color;
int year;
void run( ) {
System.out.println("car is running.");
}
void speedUp( ) {
System.out.println("car is speeding up.");
}
}
-------------------------------------------
public class Code_96 {
public static void main(String[] args)
{
Car myCar = new Car( );
myCar.kind = "Sonata";
myCar.color = "white";
myCar.year = 2015;
Car myCar2;
myCar2 = myCar;
System.out.println(myCar);
System.out.println(myCar2);
}
}
//결과값
chapter_07.Car@37374a5e
chapter_07.Car@37374a5e
- 하나의 래퍼런스 변수에 객체를 생성하고, 또 다르 래퍼런스 변수에 할당할 수도 있다.
- 래퍼런스끼리 할당하면 같은 인스턴스를 가리키게 되고, 하나의 인스턴스에 두 개의 래퍼런스명이 붙는다.
public class Student {
int no; //학번
String name; // 이름
double score; // 성적
void printStudent( ) {
System.out.println("no : " + no);
System.out.println("name : " + name);
System.out.println("score : " + score);
}
void updateScore(double change) {
score += change;
}
}
-------------------------------------------------
ublic class Code_97 {
public static void main(String[] args)
{
Student s1 = new Student( );
s1.no = 10;
s1.name = "Alice";
s1.score = 92.5;
Student s2 = new Student( );
s2.no = 20;
s2.name = "David";
s2.score = 88.2;
s1.printStudent( );
s2.printStudent( );
s1.updateScore(+2.3);
s2.updateScore(-1.5);
System.out.println("-------------------");
s1.printStudent( );
s2.printStudent( );
}
}
//결과값
no : 10
name : Alice
score : 92.5
no : 20
name : David
score : 88.2
-------------------
no : 10
name : Alice
score : 94.8
no : 20
name : David
score : 86.7
2. 생성자(constructor)
- 생성자는 인스턴스가 생성되는 순간에 자동으로 호출되는 특별한 메소드로 인스턴스에 필요한 공간을 만들고 초기화하는 역할을 한다.
> 생성자명은 클래스명과 같아야 한다.
> 생성자는 인스턴스가 생성될 때 자동으로 호출되는 특별한 메소드이다.
> 생성자는 반환 값이 없는 메소드이다.
> 생성자는 얼마든지 오버 로딩하여 사용할 수 있다.
- 디폴트 생성자(default constructor)
class 클래스명 {
클래스명() {
....
}
}
- new 키워드를 이용하여 인스턴스를 생성한다고 했는데 이때 생성자가 호출된다.
- 디폴트 생성자가 없는 경우
public class Friend { //클래스 Friend에는 생성자가 하나도 없다.
String name;
int age;
//Friend(){} 생성자가 하나도 없는 경우에는 자동으로 디폴트 생성자를 제공한다.
void printFriend( ) {
System.out.println("name : " + name + ", age : " + age);
}
}
------------------------------------------------------------------------
public class Code_98 {
public static void main(String[] args)
{
Friend f = new Friend( );
f.printFriend( );
f.name = "Alce";
f.age = 20;
f.printFriend( );
}
}
//결과값
name : null, age : 0
name : Alce, age : 20
- 디폴트 생성자가 있는 클래스
public class Dog {
String name;
int color;
Dog( ) {
System.out.println("Default constructor is called");
}
void printDog( ) {
System.out.println("name : " + name);
System.out.println("color : " + color);
}
}
-------------------------------------------------------
public class Code_99 {
public static void main(String[] args)
{
Dog d = new Dog( ); //new Dog(); 여기에서 Dog() 디폴트 생성자를 호출한다.
d.printDog( );
}
}
//결과값
Default constructor is called
name : null
color : 0
class Point {
int x;
int y;
Point( ) {
x = 10;
y = 20;
}
void print( ) {
System.out.println("(" + x + "," + y +
")");
}
}
----------------------------------------------------
public class Code_100 {
public static void main(String[] args)
{
Point p1 = new Point( );
Point p2 = new Point( );
p1.print( );
p2.print( );
}
}
//결과값
(10,20)
(10,20)
- 매개변수가 있는 생성자
class Friend {
String name;
int age;
Friend( ) { } // 디폴트 생성
Friend(String n, int a) {
name = n;
age = a;
}
void printFriend( ) {
System.out.println("name : " + name + ", age : " + age);
}
}
------------------------------------------------------------------------
public class Code_101 {
public static void main(String[] args)
{
Friend f = new Friend("Alice", 20);
f.printFriend( );
}
}
//결과값
name : Alice, age : 20
- 매개변수가 있는 생성자는 다음과 같이 입력을 갖는 생성자로 인스턴스를 생성할 때 인스턴스를 원하는 값으로 초기화 가능.
- 생성자 오버로딩(constructor overloading)
- 메소드 오버 로딩과 같이 생성자가 여러 개 있는 생성자를 오버 로딩이라 한다.
public class Student {
int no;
String name;
double score;
Student( ){}
Student(int n) {
no = n;
}
Student(int n, String nm) {
no = n;
name = nm;
}
Student(int n, String nm, double s) {
no = n;
name = nm;
score = s;
}
void printStudent( ) {
System.out.println("no : " + no + ", name : " + name + ", score : " + score);
}
}
-------------------------------------------------------------------------------------
public class Code_102 {
public static void main(String[] args)
{
Student s1 = new Student( );
Student s2 = new Student(10);
Student s3 = new Student(15, "David");
Student s4 = new Student(20, "Paul", 92.5);
s1.printStudent( );
s2.printStudent( );
s3.printStudent( );
s4.printStudent( );
}
}
//결과값
no : 0, name : null, score : 0.0
no : 10, name : null, score : 0.0
no : 15, name : David, score : 0.0
no : 20, name : Paul, score : 92.5
class Data {
int m;
Data(int x) {
m = x;
}
void printData( ) {
System.out.println("m : " + m);
}
}
-------------------------------------------
public class Code_103 {
public static void main(String[] args) {
Data d = new Data(100);
d.printData( );
}
}
//결과값
m : 100
class Student {
int no;
String name;
double score;
Student(int n) {
no = n;
}
void printStudent( ) {
System.out.println("no : " + no + ", name : " + name + ", score : " + score);
}
}
---------------------------------------------------------------
public class Code_104 {
public static void main(String[] args)
{
// Student s1 = new Student(); ->에러 발
Student s2 = new Student(10);
// s1.printStudent( );
s2.printStudent( );
}
}
//결과값
no : 10, name : null, score : 0.0
- 클래스에 디폴트 생성자가 없고, 매개변수가 있는 생성자가 존재하는 경우, 디폴트 생성자를 이용하여 객체를 생성하려면 에러 발생함.
3. 인스턴스 변수와 클래스 변수
- 클래스를 통해 인스턴스를 생성할 때, 각 인스턴스가 갖는 데이터 영역이 있고, 인스턴스들끼리 공유하는 데이터 영역이 있다.
- 각 인스턴스가 갖는 데이터는 인스턴스 변수이고, 인스턴스들 간에 공유하는 데이터는 클래스 변수라고 한다.
- 인스턴스 변수(instancee variable)
각 인스턴스마다 갖는 자신만의 데이터 영역이다.
class PersonInfo {
String name;
int age;
double height;
PersonInfo(){}
PersonInfo(String n, int a, double h) {
name = n;
age = a;
height = h;
}
void printAll( ) {
System.out.println("name : " + name);
System.out.println("age : " + age);
System.out.println("height : " + height);
}
}
------------------------------------------------------
public class Code_105 {
public static void main(String[] args)
{
PersonInfo p1 = new PersonInfo( );
PersonInfo p2 = new PersonInfo("Alice", 10, 115.5);
p1.printAll( );
p2.printAll( );
}
}
//결과값
name : null
age : 0
height : 0.0
name : Alice
age : 10
height : 115.5
class PersonInfo {
String name;
int age;
double height;
PersonInfo(){}
}
---------------------------
public class Code_106 {
public static void main(String[] args)
{
PersonInfo p = new PersonInfo( );
p.name = "Alice";
p.age = 12;
p.height = 120.5;
System.out.println("p.name : " + p.name);
System.out.println("p.age : " + p.age);
System.out.println("p.height : " + p.height);
}
}
//결과값
p.name : Alice
p.age : 12
p.height : 120.5
- 인스턴스 변수를. 을 이용하여 클래스 밖에서도 사용할 수 있다.
- 클래스 변수(static variable)
- 클래스에는 인스턴스 변수 외에 클래스 변수도 있는데 변수 앞에 static 키워드가 붙은 것이 클래스 변수이다.
class Data {
int value;
static int count;
void print( ) {
System.out.println("value : " + value);
System.out.println("count : " + count);
}
}
-----------------------------------------------
public class Code_107 {
public static void main(String[] args)
{
Data d1 = new Data( );
Data d2 = new Data( );
d1.print( );
d2.print( );
}
}
//결과값
value : 0
count : 0
value : 0
count : 0
- 클래스 Data의 각 인스턴스는 인스턴스 변수 value와 클래스 변수 count를 갖는다.
static 키워드가 붙는 변수를 '클래스 변수' 또는 '정적 변수'라고 하는데 모든 인스턴스가 공유하는 변수이다.
class Student {
static int numberOfStudent;
String name;
double score;
Student( ){
numberOfStudent ++;
}
Student(String n, double s) {
numberOfStudent ++;
name = n;
score = s;
}
void print( ) {
System.out.println("name : " + name);
System.out.println("score : " + score);
System.out.println("numberOfStudent : " +
numberOfStudent);
}
}
-------------------------------------------------------
public class Code_108 {
public static void main(String[] args)
{
Student s1 = new Student("Alice", 90.5);
Student s2 = new Student("David", 88.3);
Student s3 = new Student("Cindy", 77.1);
s1.print( );
s2.print( );
s3.print( );
}
}
//결과값
name : Alice
score : 90.5
numberOfStudent : 3
name : David
score : 88.3
numberOfStudent : 3
name : Cindy
score : 77.1
numberOfStudent : 3
- 코드에서 numberOfStudent 변수가 클래스 변수로, 세 개의 인스턴스 s1, s2, s3가 공유하는 변수이다.
- numberOfStudent 변수는 세 인스턴스가 공유하기 때문에 s1, s2, s3 생성 후에 출력을 하면 모두 같은 3을 출력하게 된다.
public class Code_109 {
public static void main(String[] args)
{
Student s1 = new Student("Alice", 90.5);
s1.print( );
Student s2 = new Student("David", 88.3);
s2.print( );
Student s3 = new Student("Cindy", 77.1);
s3.print( );
}
}
//결과값
name : Alice
score : 90.5
numberOfStudent : 1
name : David
score : 88.3
numberOfStudent : 2
name : Cindy
score : 77.1
numberOfStudent : 3
- 위 코드를 보면 생성자 안에서 numberOfStudent 값이 인스턴스를 생성할 때마다 증가하게 된다.
* 클래스 변수는 인스턴스 소유가 아니라 클래스 소유하 생각할 수 있다.
따라서 '인스턴스. 클래스 변수'라고 하는 것보단 '클래스. 클래스 변수'라고 하는 것이 합리적으로 보인다.
class BankAccount {
String name;
double balance;
static int count;
BankAccount(String name, double balance) {
this.name = name;
this.balance = balance;
count ++;
}
}
--------------------------------------------------
public class Code_110 {
public static void main(String[] args) {
BankAccount ba1 = new BankAccount("Alice", 100000);
BankAccount ba2 = new BankAccount("Paul", 50000);
BankAccount ba3 = new BankAccount("Cindy", 30000);
BankAccount ba4 = new BankAccount("David", 150000);
BankAccount ba5 = new BankAccount("Tom", 200000);
System.out.println("number of accounts : " + BankAccount.count);
}
}
//결과값
number of accounts : 5
- 클래스 변수는 클래스 이름을 이용하여 접근할 수 있고, 이 방법이 더 좋다.
'Framwork > Java기초' 카테고리의 다른 글
Chapter 8. 상속 (5) | 2023.08.06 |
---|---|
Chapter 7. 클래스와 객체(2) (0) | 2022.11.04 |
Chapter 6. 메소드 (0) | 2022.10.26 |
Chapter 5. 배열과 문자열 (2) | 2022.10.23 |
Chapter 4. 조건문과 반복문 (0) | 2022.10.09 |