자바 : 객체지향 언어
객체지향 언어 : 프로그램 구성 요소 - 객체, 객체들이 상호작용 하도록 프로그래밍
클래스 : 객체를 만들기 위한 틀 (설계도) ex) 자동차 : 객체 / 자동차 설계도 : 클래스
//클래스 선언
public class 클래스명{
//객체의 속성, 행동(method) 정의
}
public class Car{} //Car class 생성
public class Main(
public static void main(String args[]){
// Car 객체 생성
Car car1 = new Car();
Car car2 = new Car();
}
)
new 연산자 : new 연산자 뒤에 나오는 생성자를 이용하여 메모리에 객체를 생성하라는 명령.
메모리에 만들어진 객체 : 인스턴스(instance)
car1 / car2 : 만들어진 객체를 참조하는 변수
Field : 각 객체가 가지고 있는 속성
// 이름, 번호를 필드로 가지고 있는 Car class 선언
public class Car{
//field 선언
String name;
int number;
}
// 객체의 속성 이용하기
public class Main(
public static void main(String args[]){
// Car 객체 생성
Car car1 = new Car();
Car car2 = new Car();
// 생성한 객체의 속성 이용하기
car1.name = "소방차"; // caa1이 참조하는 객체의 name
car1.number = "1212"; // car1이 참조하는 객체의 number
car2.name = "구급차";
car2.number = "1919";
}
)
객체의 사용 : 참조변수.변수명 으로 참조변수를 통해 사용한다
메소드는 입력값이 있고, 입력값을 받아서 무언가를 한 뒤 결과를 도출한다. 함수와 비슷한 개념
매개변수 : 입력값 / 인자(Argument) - 함수 호출시 전달되는 값, 매개변수(Parameter) - 전달된 인자를 받아들이는 변수
리턴값 : 결과값
public class Myclass{
public void method1(){
//method1() 실행시 실행될 코드 작성
}
}
메서드 선언 : 리턴타입 메소드명(매개변수){//메소드 실행시 수행 될 코드 작성} / return 값이 없는 경우 void 키워드 사용 (return 값이 없는 걸 뜻 한다.)
public class MyClass{
public void method(){
System.out.println("method1이 실행");
}
public int method2(int y){
System.out.println("method5 실행");
y++;
return y;
}
}
// 메서드 사용하기
public class MyClassExam{
public static void main(String args[]){
MyClass my1 = new MyClass(); //메소드가 정의된 클래스 생성
//메서드 사용, 참조변수를 통해 사용
my1.method(); //method1이 실행 출력 정상 수행 확인
int result = my1.method2(5); // method2 실행 출력 정상 수행 확인
System.out.println(result); //6 출력
}
}
변수의 스코프 : 변수가 사용 가능한 범위. 보통 변수가 선언된 블럭이 그 변수의 사용범위.
public class VariableScopeExam {
int globalScope = 10; // 전역 변수
static int staticVal = 5;
public void scopeTest(int value){
int localScope = 20; // 지역 변수 : 해당 메서드 내에서만 사용 할 수 있다.
System.out.println(globalScope);
System.out.println(localScope);
System.out.println(value);
}
public static void main(String[] args) {
// main() : static 메서드
//클래스 메서드는 객체의 생성 없이 인스턴스 필드를 사용할 수 없다.
System.out.println(globalScope); //오류
System.out.println(localScope); //오류
System.out.println(value); //오류
System.out.println(staticVal); // 클래스 메서드에서 클래스 필드 사용이라 오류 x
VariableScopeExam v1 = VqriableScopeExam();
VariableScopeExam v2 = VqriableScopeExam();
v1.staticVal = 10;
v2.staticVal = 20;
// 클래스 필드는 인스턴스 생성시 만들어 지는게 아니라 값을 저장할 수 있는 공간이 하나빡에 없어서 값을 공유한다.
System.out.println(v2.staticVal); //10
System.out.println(v2.staticVal); //20
}
}
static 키워드 : class가 인스턴스화 하지 않아도 static한 메서드(클래스 메서드), static한 필드(클래스 필드)는 사용할 수 있다.
static 한 메서드(클래스 메서드) 내에서 static 하지 않은 field(인스턴스필드)는 사용할 수 없다->(static한 메서드를 사용하는 시점에 해당 클래스가 인스턴스화 되지 않았을 수 있기 때문이다.)
생성자 : 객체 생성시 Car car = new Car(); new 키워드 뒷 부분이 생성자다.
public class Car{
String name;
int number;
// 사용자가 생성자를 정의했기 때문에 기본 생성자는 자동으로 만들어지지 않는다.
public Car(String name){ // Car 객체 생성자 객체 생성시 Car 객체는 name을 갖는다.
this.name = name;
}
}
public void mainn(String[] arga){
//Car 객체 생성
// Car car1 = new car(); // error : 정의해둔 생성자가 있기 때문에 기본생성자는 자동으로 생성 되지 않아 객체를 생성할 수 없다
Car car2 = new Car("람카"); // Car class에 정의해둔 생성자, 객체 생성이 가능하다.
}
this : 현재 객체, 자기 자신을 나타낸다.
this의 사용
public class Car{
String name;
int number;
// 사용자가 생성자를 정의했기 때문에 기본 생성자는 자동으로 만들어지지 않는다.
public Car(String name){ // Car 객체 생성자 객체 생성시 Car 객체는 name을 갖는다.
this.name = name;
}
}
this.name : field 의 name 을 의미한다. (Car 객체의 name)
name : 매개변수 name을 의미한다. (외부에서 받은 변수 값 name, 그냥 변수 명이 name 인 것!)
this.name = name : 매개변수의 값을 필드에 대입해라
class MyClass2{
public int plus(int x, int y){
return x+y;
}
public int plus(int x, int y, int z){ // 매개변수의 개수 다름 : 오버로딩 성립
return x + y + z;
}
public String plus(String x, String y){// 매개변수의 타입 다름 : 오버로딩 성립
return x + y;
}
public int plus(int i, int f){ //error : 매개변수의 개수, 타입이 동일함. 변수명은 오버로딩에 영향을 끼치지 않는다.
return i+f;
}
}
생성자의 매개변수의 유형과 개수가 다르게 하여 같은 이름의 생성자를 여러 개 가질 수 있다.
public class Car{
String name;
int number;
public Car(){ // 기본생성자
this.("이름없음",0); // this() -> 자기 자신의 생성자 호출
}
public Car(String name){ // 생성자 오버로딩
// this.name = name;
this.(name, 0);
}
public Car(String name, int number){ // 생성자 오버로딩
this.name = name;
this.number = number;
}
}
상속이란?