[{"data":1,"prerenderedAt":1050},["ShallowReactive",2],{"post-document:\u002Fjava\u002Foop\u002F2026\u002F08\u002F10\u002Fjava-oop-design-four-pillars\u002F":3},{"id":4,"title":5,"body":6,"categories":1027,"date":1029,"description":1030,"extension":1031,"image":1032,"key_concepts":1032,"last_modified_at":1032,"legacyPath":1033,"meta":1034,"navigation":183,"part":1036,"path":1037,"published":183,"robots":1032,"seo":1038,"series":1039,"stem":1040,"strengths":1032,"summary":1032,"tags":1041,"tradeoffs":1032,"__hash__":1049},"posts\u002Fposts\u002FBackend\u002FJAVA\u002Foop\u002F2026-08-10-java-oop-design-four-pillars.md","Java 객체지향 Part 3: 좋은 설계와 OOP 4대 특성",{"type":7,"value":8,"toc":1016},"minimark",[9,13,18,22,25,48,51,55,149,209,213,225,230,233,241,245,248,254,258,262,265,351,365,369,372,391,398,402,409,519,543,549,553,556,658,673,677,738,783,790,794,887,893,897,1006,1012],[10,11,5],"h2",{"id":12},"java-객체지향-part-3-좋은-설계와-oop-4대-특성",[14,15,17],"h3",{"id":16},"_1-oop란","1. OOP란?",[19,20,21],"p",{},"OOP(Object-Oriented Programming)는 프로그램을 여러 **객체(Object)**로 나누고, 객체들이 서로 요청하고 응답하면서 문제를 해결하도록 설계하는 방식이다.",[19,23,24],{},"예를 들어 사람이 상품을 주문하는 상황은 다음과 같이 표현할 수 있다.",[26,27,28,40,45],"ul",{},[29,30,31,35,36,39],"li",{},[32,33,34],"code",{},"Customer"," 객체가 ",[32,37,38],{},"Product"," 객체에 주문을 요청한다.",[29,41,42,44],{},[32,43,38],{}," 객체는 자신의 가격과 재고를 확인한다.",[29,46,47],{},"각 객체는 맡은 역할과 책임에 따라 동작한다.",[19,49,50],{},"즉, 객체는 자신의 상태를 관리하고 필요한 동작을 수행하는 프로그램의 구성 단위다.",[14,52,54],{"id":53},"_2-핵심-용어","2. 핵심 용어",[56,57,58,74],"table",{},[59,60,61],"thead",{},[62,63,64,68,71],"tr",{},[65,66,67],"th",{},"용어",[65,69,70],{},"정의",[65,72,73],{},"쉬운 예시",[75,76,77,92,103,114,125,136],"tbody",{},[62,78,79,83,86],{},[80,81,82],"td",{},"클래스(Class)",[80,84,85],{},"객체를 만들기 위한 설계도",[80,87,88,91],{},[32,89,90],{},"Stock","이라는 주식 설계도",[62,93,94,97,100],{},[80,95,96],{},"객체(Object)",[80,98,99],{},"클래스를 바탕으로 만들어진 대상",[80,101,102],{},"삼성전자 주식 객체",[62,104,105,108,111],{},[80,106,107],{},"상태(State)",[80,109,110],{},"객체가 가지고 있는 데이터",[80,112,113],{},"종목명, 가격",[62,115,116,119,122],{},[80,117,118],{},"행동(Behavior)",[80,120,121],{},"객체가 수행할 수 있는 기능",[80,123,124],{},"가격 변경, 정보 출력",[62,126,127,130,133],{},[80,128,129],{},"책임(Responsibility)",[80,131,132],{},"객체가 맡아서 처리해야 하는 일",[80,134,135],{},"주식 객체가 올바른 가격을 관리하는 일",[62,137,138,141,144],{},[80,139,140],{},"메시지(Message)",[80,142,143],{},"다른 객체의 메서드를 호출해 작업을 요청하는 것",[80,145,146],{},[32,147,148],{},"stock.setPrice(80000)",[150,151,156],"pre",{"className":152,"code":153,"language":154,"meta":155,"style":155},"language-java shiki shiki-themes github-light github-dark","class Stock {\n    private String name;   \u002F\u002F 상태\n    private double price;  \u002F\u002F 상태\n\n    public void printInfo() { \u002F\u002F 행동\n        System.out.println(name + \": \" + price + \"원\");\n    }\n}\n","java","",[32,157,158,166,172,178,185,191,197,203],{"__ignoreMap":155},[159,160,163],"span",{"class":161,"line":162},"line",1,[159,164,165],{},"class Stock {\n",[159,167,169],{"class":161,"line":168},2,[159,170,171],{},"    private String name;   \u002F\u002F 상태\n",[159,173,175],{"class":161,"line":174},3,[159,176,177],{},"    private double price;  \u002F\u002F 상태\n",[159,179,181],{"class":161,"line":180},4,[159,182,184],{"emptyLinePlaceholder":183},true,"\n",[159,186,188],{"class":161,"line":187},5,[159,189,190],{},"    public void printInfo() { \u002F\u002F 행동\n",[159,192,194],{"class":161,"line":193},6,[159,195,196],{},"        System.out.println(name + \": \" + price + \"원\");\n",[159,198,200],{"class":161,"line":199},7,[159,201,202],{},"    }\n",[159,204,206],{"class":161,"line":205},8,[159,207,208],{},"}\n",[14,210,212],{"id":211},"_3-좋은-객체지향-설계","3. 좋은 객체지향 설계",[19,214,215,216,220,221,224],{},"좋은 객체지향 설계는 일반적으로 ",[217,218,219],"strong",{},"높은 응집도","와 ",[217,222,223],{},"낮은 결합도","를 지향한다.",[226,227,229],"h4",{"id":228},"응집도cohesion","응집도(Cohesion)",[19,231,232],{},"하나의 클래스 안에 서로 밀접한 역할과 기능이 모여 있는 정도다. 한 클래스가 하나의 명확한 책임에 집중할수록 응집도가 높다.",[150,234,239],{"className":235,"code":237,"language":238,"meta":155},[236],"language-text","Stock 클래스 → 종목명과 가격 관리\nOrder 클래스 → 주문 생성과 주문 상태 관리\n","text",[32,240,237],{"__ignoreMap":155},[226,242,244],{"id":243},"결합도coupling","결합도(Coupling)",[19,246,247],{},"클래스가 다른 클래스에 의존하는 정도다. 의존성이 낮을수록 한 클래스의 변경이 다른 클래스에 미치는 영향이 작다.",[150,249,252],{"className":250,"code":251,"language":238,"meta":155},[236],"높은 응집도 + 낮은 결합도\n→ 이해하기 쉽고, 수정과 확장이 쉬운 코드\n",[32,253,251],{"__ignoreMap":155},[14,255,257],{"id":256},"_4-oop의-네-가지-핵심-특징","4. OOP의 네 가지 핵심 특징",[226,259,261],{"id":260},"_41-캡슐화encapsulation","4.1 캡슐화(Encapsulation)",[19,263,264],{},"캡슐화는 객체의 데이터와 기능을 하나로 묶고, 내부 데이터를 외부에서 함부로 변경하지 못하도록 숨기는 것이다.",[150,266,268],{"className":152,"code":267,"language":154,"meta":155,"style":155},"class Stock {\n    private double price;\n\n    public double getPrice() {\n        return price;\n    }\n\n    public void setPrice(double price) {\n        if (price \u003C= 0) {\n            System.out.println(\"가격은 0보다 커야 합니다.\");\n            return;\n        }\n\n        this.price = price;\n    }\n}\n",[32,269,270,274,279,283,288,293,297,301,306,312,318,324,330,335,341,346],{"__ignoreMap":155},[159,271,272],{"class":161,"line":162},[159,273,165],{},[159,275,276],{"class":161,"line":168},[159,277,278],{},"    private double price;\n",[159,280,281],{"class":161,"line":174},[159,282,184],{"emptyLinePlaceholder":183},[159,284,285],{"class":161,"line":180},[159,286,287],{},"    public double getPrice() {\n",[159,289,290],{"class":161,"line":187},[159,291,292],{},"        return price;\n",[159,294,295],{"class":161,"line":193},[159,296,202],{},[159,298,299],{"class":161,"line":199},[159,300,184],{"emptyLinePlaceholder":183},[159,302,303],{"class":161,"line":205},[159,304,305],{},"    public void setPrice(double price) {\n",[159,307,309],{"class":161,"line":308},9,[159,310,311],{},"        if (price \u003C= 0) {\n",[159,313,315],{"class":161,"line":314},10,[159,316,317],{},"            System.out.println(\"가격은 0보다 커야 합니다.\");\n",[159,319,321],{"class":161,"line":320},11,[159,322,323],{},"            return;\n",[159,325,327],{"class":161,"line":326},12,[159,328,329],{},"        }\n",[159,331,333],{"class":161,"line":332},13,[159,334,184],{"emptyLinePlaceholder":183},[159,336,338],{"class":161,"line":337},14,[159,339,340],{},"        this.price = price;\n",[159,342,344],{"class":161,"line":343},15,[159,345,202],{},[159,347,349],{"class":161,"line":348},16,[159,350,208],{},[26,352,353,359,362],{},[29,354,355,358],{},[32,356,357],{},"private"," 필드는 외부에서 직접 접근할 수 없다.",[29,360,361],{},"공개된 메서드를 통해서만 값을 조회하거나 변경한다.",[29,363,364],{},"메서드 안에서 유효성 검사를 수행해 객체의 상태를 안전하게 보호할 수 있다.",[226,366,368],{"id":367},"_42-추상화abstraction","4.2 추상화(Abstraction)",[19,370,371],{},"추상화는 복잡한 내부 구현은 숨기고, 사용하는 사람이 알아야 할 기능만 보여 주는 것이다.",[150,373,375],{"className":152,"code":374,"language":154,"meta":155,"style":155},"interface Printable {\n    void printInfo();\n}\n",[32,376,377,382,387],{"__ignoreMap":155},[159,378,379],{"class":161,"line":162},[159,380,381],{},"interface Printable {\n",[159,383,384],{"class":161,"line":168},[159,385,386],{},"    void printInfo();\n",[159,388,389],{"class":161,"line":174},[159,390,208],{},[19,392,393,394,397],{},"사용자는 ",[32,395,396],{},"printInfo()","가 내부에서 어떻게 동작하는지 몰라도 \"정보를 출력하는 기능\"이라는 사실만 알면 사용할 수 있다.",[226,399,401],{"id":400},"_43-상속inheritance","4.3 상속(Inheritance)",[19,403,404,405,408],{},"상속은 기존 클래스의 필드와 메서드를 새로운 클래스가 물려받아 확장하는 기능이다. Java에서는 ",[32,406,407],{},"extends","를 사용한다.",[150,410,412],{"className":152,"code":411,"language":154,"meta":155,"style":155},"class Stock {\n    protected String name;\n    protected double price;\n\n    public Stock(String name, double price) {\n        this.name = name;\n        this.price = price;\n    }\n\n    public void printInfo() {\n        System.out.println(\"[일반주] \" + name + \", \" + price + \"원\");\n    }\n}\n\nclass PreferredStock extends Stock {\n    private double dividendRate;\n\n    public PreferredStock(String name, double price, double dividendRate) {\n        super(name, price);\n        this.dividendRate = dividendRate;\n    }\n}\n",[32,413,414,418,423,428,432,437,442,446,450,454,459,464,468,472,476,481,486,491,497,503,509,514],{"__ignoreMap":155},[159,415,416],{"class":161,"line":162},[159,417,165],{},[159,419,420],{"class":161,"line":168},[159,421,422],{},"    protected String name;\n",[159,424,425],{"class":161,"line":174},[159,426,427],{},"    protected double price;\n",[159,429,430],{"class":161,"line":180},[159,431,184],{"emptyLinePlaceholder":183},[159,433,434],{"class":161,"line":187},[159,435,436],{},"    public Stock(String name, double price) {\n",[159,438,439],{"class":161,"line":193},[159,440,441],{},"        this.name = name;\n",[159,443,444],{"class":161,"line":199},[159,445,340],{},[159,447,448],{"class":161,"line":205},[159,449,202],{},[159,451,452],{"class":161,"line":308},[159,453,184],{"emptyLinePlaceholder":183},[159,455,456],{"class":161,"line":314},[159,457,458],{},"    public void printInfo() {\n",[159,460,461],{"class":161,"line":320},[159,462,463],{},"        System.out.println(\"[일반주] \" + name + \", \" + price + \"원\");\n",[159,465,466],{"class":161,"line":326},[159,467,202],{},[159,469,470],{"class":161,"line":332},[159,471,208],{},[159,473,474],{"class":161,"line":337},[159,475,184],{"emptyLinePlaceholder":183},[159,477,478],{"class":161,"line":343},[159,479,480],{},"class PreferredStock extends Stock {\n",[159,482,483],{"class":161,"line":348},[159,484,485],{},"    private double dividendRate;\n",[159,487,489],{"class":161,"line":488},17,[159,490,184],{"emptyLinePlaceholder":183},[159,492,494],{"class":161,"line":493},18,[159,495,496],{},"    public PreferredStock(String name, double price, double dividendRate) {\n",[159,498,500],{"class":161,"line":499},19,[159,501,502],{},"        super(name, price);\n",[159,504,506],{"class":161,"line":505},20,[159,507,508],{},"        this.dividendRate = dividendRate;\n",[159,510,512],{"class":161,"line":511},21,[159,513,202],{},[159,515,517],{"class":161,"line":516},22,[159,518,208],{},[26,520,521,530,536],{},[29,522,523,526,527,529],{},[32,524,525],{},"PreferredStock","은 ",[32,528,90],{},"의 필드와 메서드를 물려받는다.",[29,531,532,535],{},[32,533,534],{},"super(...)","는 부모 클래스의 생성자를 호출한다.",[29,537,538,539,542],{},"상속은 두 클래스가 명확한 ",[217,540,541],{},"is-a 관계","일 때 사용하는 것이 좋다.",[150,544,547],{"className":545,"code":546,"language":238,"meta":155},[236],"PreferredStock is a Stock.\n우선주는 주식이다.\n",[32,548,546],{"__ignoreMap":155},[226,550,552],{"id":551},"_44-다형성polymorphism","4.4 다형성(Polymorphism)",[19,554,555],{},"다형성은 같은 타입의 메서드를 호출하더라도 실제 객체에 따라 서로 다르게 동작하는 성질이다.",[150,557,559],{"className":152,"code":558,"language":154,"meta":155,"style":155},"class Stock {\n    public void printInfo() {\n        System.out.println(\"일반주 정보\");\n    }\n}\n\nclass PreferredStock extends Stock {\n    @Override\n    public void printInfo() {\n        System.out.println(\"우선주 정보\");\n    }\n}\n\npublic class Main {\n    public static void main(String[] args) {\n        Stock stock1 = new Stock();\n        Stock stock2 = new PreferredStock();\n\n        stock1.printInfo(); \u002F\u002F 일반주 정보\n        stock2.printInfo(); \u002F\u002F 우선주 정보\n    }\n}\n",[32,560,561,565,569,574,578,582,586,590,595,599,604,608,612,616,621,626,631,636,640,645,650,654],{"__ignoreMap":155},[159,562,563],{"class":161,"line":162},[159,564,165],{},[159,566,567],{"class":161,"line":168},[159,568,458],{},[159,570,571],{"class":161,"line":174},[159,572,573],{},"        System.out.println(\"일반주 정보\");\n",[159,575,576],{"class":161,"line":180},[159,577,202],{},[159,579,580],{"class":161,"line":187},[159,581,208],{},[159,583,584],{"class":161,"line":193},[159,585,184],{"emptyLinePlaceholder":183},[159,587,588],{"class":161,"line":199},[159,589,480],{},[159,591,592],{"class":161,"line":205},[159,593,594],{},"    @Override\n",[159,596,597],{"class":161,"line":308},[159,598,458],{},[159,600,601],{"class":161,"line":314},[159,602,603],{},"        System.out.println(\"우선주 정보\");\n",[159,605,606],{"class":161,"line":320},[159,607,202],{},[159,609,610],{"class":161,"line":326},[159,611,208],{},[159,613,614],{"class":161,"line":332},[159,615,184],{"emptyLinePlaceholder":183},[159,617,618],{"class":161,"line":337},[159,619,620],{},"public class Main {\n",[159,622,623],{"class":161,"line":343},[159,624,625],{},"    public static void main(String[] args) {\n",[159,627,628],{"class":161,"line":348},[159,629,630],{},"        Stock stock1 = new Stock();\n",[159,632,633],{"class":161,"line":488},[159,634,635],{},"        Stock stock2 = new PreferredStock();\n",[159,637,638],{"class":161,"line":493},[159,639,184],{"emptyLinePlaceholder":183},[159,641,642],{"class":161,"line":499},[159,643,644],{},"        stock1.printInfo(); \u002F\u002F 일반주 정보\n",[159,646,647],{"class":161,"line":505},[159,648,649],{},"        stock2.printInfo(); \u002F\u002F 우선주 정보\n",[159,651,652],{"class":161,"line":511},[159,653,202],{},[159,655,656],{"class":161,"line":516},[159,657,208],{},[19,659,660,663,664,666,667,669,670,672],{},[32,661,662],{},"stock2","의 변수 타입은 ",[32,665,90],{},"이지만 실제 객체는 ",[32,668,525],{},"이다. 따라서 실행할 때는 자식 클래스가 재정의한 ",[32,671,396],{},"가 호출된다.",[14,674,676],{"id":675},"_5-오버로딩과-오버라이딩","5. 오버로딩과 오버라이딩",[56,678,679,692],{},[59,680,681],{},[62,682,683,686,689],{},[65,684,685],{},"구분",[65,687,688],{},"오버로딩(Overloading)",[65,690,691],{},"오버라이딩(Overriding)",[75,693,694,705,716,727],{},[62,695,696,699,702],{},[80,697,698],{},"의미",[80,700,701],{},"같은 이름의 메서드를 매개변수에 따라 여러 개 정의",[80,703,704],{},"부모 메서드를 자식 클래스에서 다시 정의",[62,706,707,710,713],{},[80,708,709],{},"조건",[80,711,712],{},"매개변수의 개수 또는 타입이 달라야 함",[80,714,715],{},"메서드 이름과 매개변수가 같아야 함",[62,717,718,721,724],{},[80,719,720],{},"목적",[80,722,723],{},"다양한 입력 방식 제공",[80,725,726],{},"객체에 따라 다른 동작 제공",[62,728,729,732,735],{},[80,730,731],{},"관련 개념",[80,733,734],{},"컴파일 시점 다형성",[80,736,737],{},"실행 시점 다형성",[150,739,741],{"className":152,"code":740,"language":154,"meta":155,"style":155},"class Calculator {\n    int add(int a, int b) {\n        return a + b;\n    }\n\n    double add(double a, double b) {\n        return a + b;\n    }\n}\n",[32,742,743,748,753,758,762,766,771,775,779],{"__ignoreMap":155},[159,744,745],{"class":161,"line":162},[159,746,747],{},"class Calculator {\n",[159,749,750],{"class":161,"line":168},[159,751,752],{},"    int add(int a, int b) {\n",[159,754,755],{"class":161,"line":174},[159,756,757],{},"        return a + b;\n",[159,759,760],{"class":161,"line":180},[159,761,202],{},[159,763,764],{"class":161,"line":187},[159,765,184],{"emptyLinePlaceholder":183},[159,767,768],{"class":161,"line":193},[159,769,770],{},"    double add(double a, double b) {\n",[159,772,773],{"class":161,"line":199},[159,774,757],{},[159,776,777],{"class":161,"line":205},[159,778,202],{},[159,780,781],{"class":161,"line":308},[159,782,208],{},[19,784,785,786,789],{},"위 코드는 매개변수 타입이 다른 ",[32,787,788],{},"add()"," 메서드를 여러 개 정의한 오버로딩 예시다.",[14,791,793],{"id":792},"_6-절차적-프로그래밍과-oop-비교","6. 절차적 프로그래밍과 OOP 비교",[56,795,796,808],{},[59,797,798],{},[62,799,800,802,805],{},[65,801,685],{},[65,803,804],{},"절차적 프로그래밍",[65,806,807],{},"객체지향 프로그래밍",[75,809,810,821,832,843,854,865,876],{},[62,811,812,815,818],{},[80,813,814],{},"중심 단위",[80,816,817],{},"함수와 실행 순서",[80,819,820],{},"클래스와 객체",[62,822,823,826,829],{},[80,824,825],{},"데이터 처리",[80,827,828],{},"데이터와 함수를 주로 분리",[80,830,831],{},"데이터와 메서드를 객체 안에 묶음",[62,833,834,837,840],{},[80,835,836],{},"실행 흐름",[80,838,839],{},"정해진 순서에 따라 함수 호출",[80,841,842],{},"객체끼리 메시지를 주고받으며 동작",[62,844,845,848,851],{},[80,846,847],{},"재사용",[80,849,850],{},"함수 단위 재사용",[80,852,853],{},"클래스, 객체, 상속, 조합을 통한 재사용",[62,855,856,859,862],{},[80,857,858],{},"유지보수",[80,860,861],{},"규모가 커지면 데이터 흐름 추적이 어려울 수 있음",[80,863,864],{},"역할과 책임이 잘 분리되면 변경 범위를 줄이기 쉬움",[62,866,867,870,873],{},[80,868,869],{},"대표 개념",[80,871,872],{},"순차, 조건, 반복, 함수",[80,874,875],{},"캡슐화, 추상화, 상속, 다형성",[62,877,878,881,884],{},[80,879,880],{},"대표 언어",[80,882,883],{},"C, Pascal, Fortran",[80,885,886],{},"Java, C++, C#, Python",[888,889,890],"blockquote",{},[19,891,892],{},"C++가 객체지향 프로그래밍을 지원하며, C는 대표적인 절차적 프로그래밍 언어다.",[14,894,896],{"id":895},"_7-핵심-정리","7. 핵심 정리",[56,898,899,912],{},[59,900,901],{},[62,902,903,906,909],{},[65,904,905],{},"개념",[65,907,908],{},"한 문장 정의",[65,910,911],{},"Java의 주요 구현 방법",[75,913,914,928,941,958,973,984,995],{},[62,915,916,919,922],{},[80,917,918],{},"객체",[80,920,921],{},"상태와 행동을 함께 가지는 프로그램 구성 단위",[80,923,924,927],{},[32,925,926],{},"new","로 인스턴스 생성",[62,929,930,933,936],{},[80,931,932],{},"캡슐화",[80,934,935],{},"데이터를 숨기고 공개된 메서드로 접근을 제어",[80,937,938,940],{},[32,939,357],{},", getter, setter",[62,942,943,946,949],{},[80,944,945],{},"추상화",[80,947,948],{},"복잡한 구현을 숨기고 필요한 기능만 노출",[80,950,951,954,955],{},[32,952,953],{},"interface",", ",[32,956,957],{},"abstract class",[62,959,960,963,966],{},[80,961,962],{},"상속",[80,964,965],{},"기존 클래스의 기능을 물려받아 확장",[80,967,968,954,970],{},[32,969,407],{},[32,971,972],{},"super",[62,974,975,978,981],{},[80,976,977],{},"다형성",[80,979,980],{},"같은 호출이 실제 객체에 따라 다르게 동작",[80,982,983],{},"오버라이딩, 부모 타입 참조",[62,985,986,989,992],{},[80,987,988],{},"응집도",[80,990,991],{},"한 클래스의 기능이 하나의 책임에 집중된 정도",[80,993,994],{},"단일 책임을 가진 클래스 설계",[62,996,997,1000,1003],{},[80,998,999],{},"결합도",[80,1001,1002],{},"클래스끼리 서로 의존하는 정도",[80,1004,1005],{},"인터페이스를 통한 의존성 분리",[150,1007,1010],{"className":1008,"code":1009,"language":238,"meta":155},[236],"객체지향 프로그래밍의 핵심\n= 객체마다 역할과 책임을 나누고\n+ 내부 상태는 안전하게 보호하며\n+ 객체들이 협력하도록 설계하는 것\n",[32,1011,1009],{"__ignoreMap":155},[1013,1014,1015],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":155,"searchDepth":168,"depth":168,"links":1017},[1018],{"id":12,"depth":168,"text":5,"children":1019},[1020,1021,1022,1023,1024,1025,1026],{"id":16,"depth":174,"text":17},{"id":53,"depth":174,"text":54},{"id":211,"depth":174,"text":212},{"id":256,"depth":174,"text":257},{"id":675,"depth":174,"text":676},{"id":792,"depth":174,"text":793},{"id":895,"depth":174,"text":896},[154,1028],"oop","2026-08-10 13:00:00 +0900","응집도와 결합도, 캡슐화, 추상화, 상속, 다형성을 중심으로 객체지향 설계 원칙을 정리한다.","md",null,"\u002Fjava\u002Foop\u002F2026\u002F08\u002F10\u002Fjava-oop-design-four-pillars\u002F",{"layout":1035},"post","3","\u002Fposts\u002Fbackend\u002Fjava\u002Foop\u002F2026-08-10-java-oop-design-four-pillars",{"title":5,"description":1030},"Java 객체지향","posts\u002FBackend\u002FJAVA\u002Foop\u002F2026-08-10-java-oop-design-four-pillars",[1042,1043,1044,1045,1046,1047,1048],"Java","OOP","Object","Encapsulation","Abstraction","Inheritance","Polymorphism","OKWsxvTiJfl_9f80X1KOxlk6H2e-rRUn13uJG7_JWgg",1788744785055]