☕JAVA/🔎 공부 [JAVA]

[JAVA] 객체지향 / 클래스 Class /메쏘드 Method / Static

디카페인라떼 2022. 8. 8. 00:12

2022.06.20 - [준비운동/생활코딩 자바] - 6일차 패키지/클래스/인스턴스/상속

 

JAVA는 객체지향 프로그래밍이다.

 

  • 객체 지향 프로그래밍 (OOP)

프로그램을 구성하는 요소는 객체이며 이것이 상호작용 하도록 프로그래밍한다.


컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.

위키


객체 지향 프로그래밍에서 클래스는 객체를 만들기 위한 확장 가능한 코드 템플릿이며, 상태(멤버 변수) 및 동작(멤버 함수 or 메서드) 구현에 대한 초기값을 제공한다. 많은 언어에서 클래스명은 클래스의 이름(템플릿 자체), 클래스의 기본 생성자(객체를 생성하는 서브 루틴)의 이름 및 클래스를 인스턴스화해서 생성된 객체의 유형으로 사용된다.
클래스의 생성자에 의해 객체가 생성되면, 결과 객체를 클래스의 인스턴스라고 하고 객체의 특정 멤버변수를 인스턴스 변수라고 한다. 이는 클래스에서 공유되는 클래스 변수와 대조된다. 


  • 개념 정리 먼저 !

 

  • 객체(인스턴스)  - 클래스 생산자를 통해 만들어진 것. 인스턴스화(보드카 얼음/쥬시쿨어름/얼음..)  (붕어빵)
  • 클래스 Class - 객체를 생성 하기 위한 일종의 틀 (얼음틀) (붕어빵 틀)
  • 메쏘드 Method - 객체를 행동/동작하게 하는 것 
  • Static - 작업환경에 미리 준비해둔 것 / 다른 메쏘드를 호출할 때 같은 스태틱만 호출할 수 있다.  return 할때 이야기 !! // static을 사용하면 (객체를 생성하지 않아도)인스턴스화 하지 않아도 사용할 수 있다

=>일단 내가 이해한 것...

 

추가 적인 자료 

생활코딩 : 메소드, 객체

블로그  + 프로그래머스 자바 입문강의

 


<클래스>

  • 붕어빵이 객체라면 붕어빵 틀은 클래스.
  • 자동차 클래스 생성
<클래스 선언>
public class Car(클래스명){  ㄱ
                             클래스 블록
}                            」
  • Car.java란 파일을 만든다.
  • 저장을 하면 이클립스는 컴파일하여 디스크에 Car라는 클래스를 생성한다.
  • 자동차 클래스가 생성되었다고 해서 자동차가 만들어 진것은 아니다.

Car객체 생성하기 (자동차 만들기)

    public class CarExam{
        public static void main(String args[]){
            (참조형타입)Car (변수)c1 = (연산자)new (생성자/객체=인스턴스)Car();
            Car c2 = new Car();
        }
    }
  • new 연산자는 new연산자 뒤에 나오는 생성자를 이용하여 메모리에 객체를 만들라는 명령.
  • 메모리에 만들어진 객체를 인스턴스(instance)라고도 한다.
  • 이렇게 만들어진 객체를 참조하는 변수가 c1 , c2 이다.
  • 위의 코드가 실행되면 Car라는 객체가 2개가 만들어지고 각각의 객체를 참조하는 c1과 c2변수가 선언됩니다.
  • 클래스는 모든 참조형 타입 가능객체생성시 new 반드시 붙이기, 
    new 연산자+생성자(인스턴스)<객체 를 참조하는 변수가 c1,c2로 선언됨★★

<참조형 타입>

2022.08.09 - [JAVA] - [JAVA] 데이터타입 - 기본형 타입 / 참조형 타입

 

  • 참조형 변수
    • String str = new String("hello");
      • str 변수 앞에 기본형 타입이 아닌 String클래스가 적혀있다.
      • 이퀄(=)뒤에는 new 다음에 생성자라는 것이 있다.
      • new 라는 키워드는 객체를 메모리에 올려준다. 이렇게 메모리에 올라간 객체인스턴스라고 말한다.
      • String(클래스) str(변수) = new + 생성자(인스턴스) // =>str변수는 string 인스턴스를 참조한다
  • 메모리에 올라간 인스턴스를 가리키는 변수, 참조하는 변수, 레퍼런스 하는 변수가 str 이다. 참조한다. 레퍼런스 한다라는 것은 변수가 인스턴스를 가지고 있는게 아니라 말그대로 가리킨다는 의미이다.
  • str이라는 변수에는 메모리의 위치 값이 저장되는 것이다. 메모리의 위치값이 저장된다고 하더라도, 어떤 메모리에 저장되는지 그 정보를 알 수 있는 방법은 없다. 그렇기 때문에 str변수는 String 인스턴스를 참조한다라고만 아시면 된다.
  • 앞으로 배울 클래스들은 모두 참조형이다

<String 클래스>

  • 문자열을 표현하는 자바에서 가장 많이 사용하는 클래스
  • new연산자를 이용하지 않고 인스턴스 를 만들 수 있다
String str1 = "hello";//상수에 저장
String str2 = "hello";//같은 상수 영역에 저장
//같은 인스턴스를 참조하고있다

String str3 = new String ("hello");
String str4 = new String ("hello");
//new 가 나온 순간 무조건 새로 (힙영역에) 생성!! 따로따로 참조

if(str1 == str2)//true
System.out.println("str1과 str2는 같은 레퍼런스를 참조한다.");
		
if(str3 == str4)//false
System.out.println("str3과 str4는 같은 레퍼런스를 참조한다.");

System.out.println(str1.substring(3));//lo//.substring method 사용		
System.out.println(str1);//hello
//String은 한번 만들어진 클래스 내의 값이 변하지 않음!! 모든 메소드들이 String값을 반환함.
//String만의 특징!

2022.08.06 - [JAVA] - [JAVA] Substring() 문자열 자르기

 


<필드(field) 선언> - 클래스의 구성 요소 - 객체가 가지는 속성

  • 자동차는 자동차 이름, 자동차 번호를 가지고 있고, 자동차는 달리고 멈추는 기능이 있다. 여기에서 가지고 있는 것을 속성이라고 한다. 자바에서는 이러한 속성을 필드(Field)라는 용어로 사용
  • car(클래스) - >이름,번호 (속성=필드)
public class Car {
//타입 필드명
String name;
int number;
public class CarExam {
public static void main(String[] args) {
Car c1 = new Car();
Car c2 = new Car();
//클래스는 모든 참조형 타입 가능,객체생성시 new 반드시붙이기, new 연산자+생성자(인스턴스)객체를 참조하는 변수가 c1,c2로 선언
//참조변수.참조변수가 참조하는 객체가 가진것
c1.name = "소방차";//속성
c1.number = 1234;
		
c2.name = "구급차";
c2.number = 1111;
		
System.out.println(c1.name);
System.out.println(c1.number);
		
System.out.println(c2.name);
System.out.println(c2.number);
//객체들마다 속성을 각각 생성 가능

<메소드> - 클래스가 가진 기능!

  • 필드가 물체의 상태라면, 물체의 행동에 해당하는게 메소드다. car에 이름과 번호가 있기도 하지만, car는 앞으로 전진할수도 있고 후진하는 행동도 할 수 있다.
  • 메소드는 입력값이 있고, 그 입력값을 받아서 무언가 한 다음 결과를 도출해 내는 수학의 함수와 비슷한 개념이다.
  • 이때 입력값을 매개변수라고 하고,결과값을 리턴값이라고 합니다.
    • 인자( Argument ) 는 어떤 함수를 호출시에 전달되는 값을 의미한다.
    • 매개 변수( Parameter )그 전달된 인자를 받아들이는 변수를 의미한다.
  • 메소드란 클래스가 가지고 있는 기능이다. 클래스 안에 선언됩니다.

<메소드 선언>

//	public 리턴타입 메소드명 (매개변수) { 구현 }
	//리턴타입의 유무에따라 다양함
    
	//리턴타입 없는경우
	public void method1() { //void : 리턴타입이 없다!
		System.out.println("매개변수,리턴타입없음");
	}
	//정수를 받아들이고 리턴없음
	public void method2(int x) {
		System.out.println(x+"매개변수는 있으나 리턴없음");
	}
	//매개변수 없으나 리턴있음.
	public int method3() {
		System.out.println("매개변수 없으나 리턴실행");
		return 10;
	}
	//정수값 2개 받아들이고 리턴하지않음
	public void method4(int x, int y) {
		System.out.println(x +y +"매개변수2개도 가능.리턴없음");
	}
	//정수값 받고 리턴도 있음
	public int method5(int y) {
		System.out.println(y + "매개변수 있고 리턴도 있음");
		return y*2;
	}

<메소드의 사용>

  • 메소드를 사용하기 위해서는 메소드가 정의된 클래스인 MyClass 가 생성되어야 한다
  • 클래스가 가진 메소드를 사용하기 위해서는 객체로 만들어야 사용할 수 있다
  • 객체를 생성할 때는 new 연산자를 이용한다.
  • 메소드 사용할때는 생성된 클래스를 참조하는 레퍼런스변수.메소드명() 으로 사용할 수 있다.
public class MyClassExam {

	public static void main(String[] args) {
		MyClass myclass = new MyClass();//메소드가 정의된 클래스 생성
        
		myclass.method1();//MyClass 에서 정의한 메소드 호출
        
		myclass.method2(10);
        
		int value = myclass.method3();//리턴 값을 받아낼 변수를 지정해야함
		System.out.println(value);
        
		myclass.method4(5, 10);
        
		int value2 = myclass.method5(55);        
		System.out.println(value2);

	}

❗객체지향은 모든 기능을 구현하려 하는것보다 객체를 잘이용->기능을 잘이용 (메소드를 잘이용하는게 핵심)

 


<Static>

  • 같은 클래스 내에 있음에도 해당 변수들을 사용할 수 없다.
  • main 메소드는 static 이라는 키워드로 메소드가 정의되어 있다. 이런 메서드를 static 한 메소드 라고 한다.
  • static한 필드(필드 앞에 static 키워드를 붙힘)나, static한 메소드는 Class가 인스턴스화 되지 않아도 사용할 수 있다.
 public class VariableScopeExam {
        int globalScope = 10; 
        static int staticVal = 7;

        public void scopeTest(int value){
            int localScope = 20;        
        }

        public static void main(String[] args) {
            System.out.println(staticVal);      //사용가능 
        }

    }

static한 변수는 공유된다.

  • static하게 선언된 변수는 값을 저장할 수 있는 공간이 하나만 생성된다. 그러므로, 인스턴스가 여러개 생성되도 static한 변수는 하나다.
    ValableScopeExam v1 = new ValableScopeExam();//ststic하지 않은 변수를 사용하려면 객체 생성
    ValableScopeExam v2 = new ValableScopeExam();//인스턴스 변수
    v1.golbalScope = 20;
    v2.golbalScope = 30; 

    System.out.println(v1.golbalScope);  //20 이 출력된다. 
    System.out.println(v2.golbalScope);  //30이 출력된다. 

    v1.staticVal = 10;//static한 변수는 바로 사용 가능but 저장 공간은 하나뿐 (클래스변수)
    v2.staticVal = 20; 

    System.out.println(v1.statVal);  //20 이 출력된다. 
    System.out.println(v2.statVal);  //20 이 출력된다.
  • golbalScope같은 변수(필드)는 인스턴스가 생성될때 생성되기때문에 인스턴스 변수라고 한다.
  • staticVal같은 static한 필드를 클래스 변수라고 한다.
  • 클래스 변수는 레퍼런스.변수명 하고 사용하기 보다는 클래스명.변수명 으로 사용하는것이 더 바람직하다고 하다.
    • VariableScopeExam.staticVal

'☕JAVA > 🔎 공부 [JAVA]' 카테고리의 다른 글

[JAVA] 변수(Variable)와 상수(Constant)  (0) 2022.08.09
[JAVA]HashMap  (0) 2022.08.08
[JAVA] 대소문자 만들기 toLowerCase, toUpperCase  (0) 2022.08.06
[JAVA] LocalDate,LocalTime,LocalDateTime  (0) 2022.08.06
[JAVA] charAt()  (0) 2022.08.06