-
Java ClassJava 2024. 9. 7. 23:28
Java는 모든 것이 Class나 객체와 연관되어있다.
class 정의:
modifier class ClassName { //attributes //constructor //methods }class이름은 모든 단어의 첫 글자를 대문자로 한다.
class를 위한 access modifier는 public과 default가 있다.
- public - 클래스는 다른 클래스에 의해 접근 가능하다
- default - 클래스는 같은 패키지 안에 있는 클래스들에 의해서만 접근 가능하다. modifier를 지정하지 않았을 때 사용된다.
class를 위한 non-access modifier는 final과 abstract가 있다.
- final - 클래스는 다른 클래스에 의해 상속받아질 수 없다.
- abstract - 클래스는 객체 생성을 위해 사용될 수 없다. (abstract 클래스에 접근하려면 다른 클래스에 의해 상속받아져야 한다.)
객체 생성:
ClassName myObj = new ClassName();객체 생성은
클래스이름 객체이름 = new 클래스생성자();
로 생성한다.
1. Attributes (속성)
속성 정의
class의 attribute 정의는
modifier type attributeName = value;
로 정의한다.
public class Main { public int x = 5; int y = 3; }속성 이름은 첫 단어의 첫 문자는 소문자, 두번째 단어부터의 첫 문자는 대문자로 한다.
속성 접근
objName.attributeName으로 속성에 접근한다.
public class Main { int x = 5; public static void main(String[] args) { Main myObj = new Main(); System.out.println(myObj.x); } }또는 static을 부여해 ClassName.attributeName으로 속성에 접근한다.
public class Main { static int x = 5; public static void main(String[] args) { System.out.println(Main.x); } }속성 변경
속성 값을 변경할 수 있다.
public class Main { int x = 5; public static void main(String[] args) { Main obj = new Main(); obj.x = 10; System.out.println(obj.x); } }static 속성 값 변경
public class Main { static int x = 5; public static void main(String[] args) { Main.x = 10; System.out.println(Main.x); } }final modifier를 붙이면 값 변경이 불가능하다.
public class Main { final static int MIN_WIDTH = 5; public static void main(String[] args) { Main.MIN_WIDTH = 10; // error: cannot assign a value to static final variable x System.out.println(Main.x); } }final이 붙은 상수 이름은 모두 대문자이고 단어는 _로 구분한다.
2. Methods (메소드)
메소드 정의
public class Main { modifier returnType methodName([type parameter1[, type parameter2[, ...]]]) { // code to be executed } }메소드 이름은 첫 단어의 첫 문자는 소문자, 두번째 단어부터의 첫 문자는 대문자로 한다.
메소드 오버로딩 (Method Overloading)
다른 파라미터를 사용한다면 같은 이름의 메소드를 여러개 만들 수 있다.
public class Main { static int plusMethodInt(int x, int y) { return x + y; } static double plusMethodDouble(double x, double y) { return x + y; } public static void main(String[] args) { int myNum1 = plusMethodInt(8, 5); double myNum2 = plusMethodDouble(4.3d, 6.26d); System.out.println("int: " + myNum1); System.out.println("double: " + myNum2); } }3. 생성자 (Constructors)
생성자는 객체를 초기화하는 특별한 메소드이다.
생성자는 클래스의 객체가 생성될 때 호출된다.
생성자 정의
생성자는 클래스 이름과 일치해야하며, return type를 가지지 않는다.
public class Main { int x; public Main() { x = 5; } public static void main(String[] args) { Main myObj = new Main(); System.out.println(myObj.x); } }클래스의 생성자를 만들지 않으면 Java는 기본적으로 생성자를 하나 만들어준다.
생성자 파라미터
생성자에 매개변수를 전달할 수 있다.
public class Main { int x; int y; public Main() { this(5); } public Main(int x) { this(x, 4); } public Main(int x, int y) { this.x = x; this.y = y; } public static void main(String[] args) { Main myObj = new Main(); System.out.println(myObj.x + " " + myObj.y); } }attributes, methods, constructors를 위한 access modifier는 public, private, default, protected가 있다.

- public - 코드는 모든 클래스에서 접근 가능하다.
- protected - 코드는 같은 패키지 안에서 또는 subclass 에서 접근 가능하다.
- default - 코드는 같은 패키지 안에서만 접근 가능하다. modifier를 지정하지 않았을 때 사용된다.
- private - 코드는 선언된 클래스 내부에서만 접근 가능하다.
attributes, methods를 위한 non-access modifier는 final, static, abstract, transient, synchronized, volatile이 있다.
- final - attribute와 method는 오버라이드/변경이 불가능하다.
- static - attribute와 method는 객체 대신 클래스에 속한다.
- abstract - abstract 클래스 안에서만 사용할 수 있고, method에게만 사용할 수 있다. 그 메소드는 body를 가질 수 없다. body는 subclass에 의해 제공된다.
- transient - 객체가 serializing 될 때, transient인 attribute와 method는 생략된다.
- synchronized - 메소드는 한번에 하나의 쓰레드에서만 접근 가능하다.
- volatile - attribute의 값은 thread 지역에 캐시되지 않고, 항상 메인 메모리에서 읽는다.
4. 패키지 (Packages)
java 패키지는 관련된 클래스를 모아놓은 것이다. 파일들이 들어있는 디렉토리 같은 것이다.
class 가져오기
import java.util.Scanner;package 가져오기
import java.util.*;유저 정의 패키지
패키지를 만들기 위해서, 클래스를 패키지 이름 디렉토리의 자식으로 있어야 한다.
패키지 이름은 모두 소문자로 이루어진다.
package mypack; class MyPackageClass { public static void main(String[] args) { System.out.println("This is my package!"); } }mypack이라는 디렉토리 안에 MyPackageClass.java파일의 내용이다.
mypack의 상위 디렉토리로 이동 후, javac 컴파일을 한다.
javac mypack/MyPackageClass.java실행
java mypack.MyPackageClass5. 상속 (Inheritance)
java에서는 다른 클래스의 속성과 메소드를 상속받는것이 가능하다.
subclass (child) - superclass로부터 상속을 받은 클래스
superclass (parent) - subclass에게 상속을 해준 클래스
final 클래스는 상속을 해줄 수 없다.
class SubClass extends SuperClass { }extends키워드를 사용해 상속받는다. 한 클래스는 하나의 부모 클래스만 상속 가능하다. 다중상속은 interface를 implement한다.
6. 다형성 (Polymorphism)
java의 다형성은, subclass가 superclass의 메소드를 재정의하여 다른 작업하는것을 허락하는 것이다.
class Animal { public void animalSound() { System.out.println("animal sound"); } } class Pig extends Animal { public void animalSound() { System.out.println("oink"); } } class Dog extends Animal { public void animalSound() { System.out.println("bark bark"); } } class Main { public static void main(String[] args) { Animal animal = new Animal(); Animal pig = new Pig(); Animal dog = new Dog(); animal.animalSound(); pig.animalSound(); dog.animalSound(); } }7. Inner Class (Nested Class)
java에서는 클래스 내부 클래스가 가능하다. 이것의 목적은 클래스를 그룹화하여 읽고 관리하기 쉽게 하는 것이다.
class OuterClass { int x = 10; class InnerClass { int y = 5; } } public class Main { public static void main(String[] args) { OuterClass myOuter = new OuterClass(); OuterClass.InnerClass myInner = myOuter.new InnerClass(); System.out.println(myInner.y + myOuter.x); } }// 나중에 더 내용 추가 요망
8. 추상화 (Abstraction)
abstract class: 객체를 만들 수 없는 제한적인 클래스. 추상적인 메소드와 일반적인 메소드 둘다 가질 수 있다.
abstract method: abstract 클래스에서만 사용할 수 있고, body를 가지지 않는 메소드.
abstract class Animal { public abstract void animalSound(); public void sleep() { System.out.println("Zzz"); } } class Pig extends Animal { public void animalSound() { System.out.println("The pig says: wee wee"); } } class Main { public static void main(String[] args) { Pig myPig = new Pig(); // Create a Pig object myPig.animalSound(); myPig.sleep(); } }9. 인터페이스 (Interface)
abstraction을 이루는 또다른 방법으로 Interface가 있다.
interface는 완전히 추상화된 클래스로 추상적인 메소드만 가질 수 있다.
interface는 다른 클래스에게 상속시킬 때, extends 키워드 대신 implements 키워드를 사용한다.
interface Animal { public void animalSound(); public void sleep(); } class Pig implements Animal { public void animalSound() { System.out.println("The pig says: wee wee"); } public void sleep() { System.out.println("Zzz"); } } class Main { public static void main(String[] args) { Pig myPig = new Pig(); // Create a Pig object myPig.animalSound(); myPig.sleep(); } }- abstract 클래스와 비슷하게, interface는 객체를 만들 수 없다.
- interface 메소드들은 body를 가질 수 없다.
- interface를 implement할 때, 모든 메소드들을 재정의 해야한다.
- interface 메소드들은 기본적으로 abstract이고 public이다.
- interface 속성들은 기본적으로 public이고 static 이고 final이다.
- interface는 생성자를 가질 수 없다.
java는 다수의 상속을 지원하지 않는다. 그러나 다수의 interface를 implement하는것은 지원한다.
interface FirstInterface { public void myMethod(); // interface method } interface SecondInterface { public void myOtherMethod(); // interface method } class DemoClass implements FirstInterface, SecondInterface { public void myMethod() { System.out.println("Some text.."); } public void myOtherMethod() { System.out.println("Some other text..."); } } class Main { public static void main(String[] args) { DemoClass myObj = new DemoClass(); myObj.myMethod(); myObj.myOtherMethod(); } }
참조: https://www.w3schools.com/java/java_oop.asp
https://www.oracle.com/java/technologies/javase/codeconventions-namingconventions.html
-
'Java' 카테고리의 다른 글
Java 콘솔 입출력 (console output & input) (0) 2024.09.19 Java 자료구조 클래스 (Data Structure Classes) (1) 2024.09.14 Java 연산자 우선순위 (Operator Precedence in Java) (0) 2024.09.06 Java 자료형 (Java Data Types) (1) 2024.09.06 Java 기본 문법 (0) 2024.09.06